gpt4 book ai didi

c++ - 我们什么时候必须在派生类c++中定义析构函数

转载 作者:行者123 更新时间:2023-11-30 01:15:43 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com