作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 C++ 的新手,我正面临内存泄漏,这让我想知道我可能没有理解正确的东西。
我有:
.h文件
class DeliveryVehicle{
public:
//c'tor
DeliveryVehicle(const char* ID, Quality quality);
//d'tor
virtual ~DeliveryVehicle();
...
protected:
VehicleParcelQueue parcelQueue_;
}
.c文件
DeliveryVehicle::~DeliveryVehicle(){
while(!parcelQueue_.empty()) parcelQueue_.pop();
// pop() calls removed element destructor
}
我有一个派生类,我在其中依靠默认析构函数,而不是显式实现析构函数。
我想知道,如果我不使用“new”在派生类中分配内存,是否可以?
此外,我实现了自己的固定大小队列,它继承了 STL 的基类队列:
.h文件
class VehicleParcelQueue:public std::queue<Parcel*>{
public:
const static int MaxParcelsNum = 5;
Result push(Parcel*);
};
.cpp文件
typedef enum result{SUCCESS = 1,FAILURE = 0} Result;
Result VehicleParcelQueue::push(Parcel* pParcel){
if (size() >= 5) return FAILURE;
else{
queue<Parcel*>::push(pParcel);
return SUCCESS;
}
可以看出,同样在这种情况下,我没有显式地实现析构函数。我容易发生内存泄漏吗?
也许 pop 不为 Parcle 调用 delete 而是为指针调用析构函数?谢谢
最佳答案
除了 R Sahu 的回答,注意 std::queue<>
析构函数不是虚拟的,任何从指向 Base 的指针的删除都会调用未定义的行为(因此,您通常不应从标准容器继承)。
您可能应该检查您的设计,例如使用类成员而不是继承,并且如果可能的话更喜欢值而不是指针:
VehicleParcelQueue
{
...
std::queue<Parcel> queue;
};
关于c++ - 我们什么时候必须在派生类c++中定义析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28034927/
我是一名优秀的程序员,十分优秀!