我使用的是borland 2006 c ++,并且有以下代码。我正在使用向量,并且无法理解为什么没有调用析构函数。
基本上我有一个A级
class A
{
private:
TObjectList* list;
int myid;
public:
__fastcall A(int);
__fastcall ~A();
};
__fastcall A::A(int num)
{
myid = num;
list = new TObjectList();
}
__fastcall A::~A()
{
delete list;
}
int main(int argc, char* argv[])
{
myfunc();
return 0;
}
void myfunc()
{
vector<A*> vec;
vec.push_back(new A(1));
vec.push_back(new A(2));
}
根据我读到的,当变量vec超出myfunc()中的范围时,它应该破坏其包含的元素,因此应该调用A的析构函数。我在~A()处有一个断点,但是从来没有被调用过,我试过resize(),擦除方法也
TIA
答案 0 :(得分:15)
vec在超出范围时会破坏它的元素。这里的问题是vec的元素是A对象的指针,而不是A对象本身。如果你做了
vector<A> vec;
vec.push_back(A(1));
vec.push_back(A(2));
......然后事情会像你期望的那样奏效。
ETA:但请注意,如果你这样做,你必须为A定义一个复制构造函数。这应该包括对TObjectList成员进行深层复制。否则,当你复制一个A对象时,你将最终得到两个指向同一个TObjectList的对象,并且当第二个对象被销毁时你的程序会崩溃。
答案 1 :(得分:3)
由于您没有A
的向量,因此未调用A
的析构函数。你有一个指向A
的指针向量,并且调用指针的析构函数。指针没有析构函数,所以没有任何反应。
删除所有内容的一种方法是手动执行类似
的操作while (!vec.empty())
{
delete vec.back();
vec.pop_back();
}
答案 2 :(得分:3)
已经有很多好的答案,但我还要补充一点:
使用Boost Pointer Container Library中的 boost :: ptr_vector ,而不是std :: vector。当向量超出范围时,它将删除对象,从而调用析构函数。
答案 3 :(得分:1)
抓住Boost库,无论你在上面有一个原始指针,你都可以使用boost :: shared_ptr&lt;&gt;代替。 (好吧,不在main()的签名中。)