我使用的是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));
}
Run Code Online (Sandbox Code Playgroud)
根据我读到的,当变量vec超出myfunc()中的范围时,它应该破坏其包含的元素,因此应该调用A的析构函数.我在~A()处有一个断点,但从未被调用过,我也尝试过resize(),擦除方法
TIA
Dav*_*ler 15
当vec超出范围时,它会破坏它的元素.这里的问题是vec的元素是A对象的指针,而不是A对象本身.如果你做了
vector<A> vec;
vec.push_back(A(1));
vec.push_back(A(2));
Run Code Online (Sandbox Code Playgroud)
......那么事情会像你期望的那样奏效.
ETA:但是请注意,如果你这样做,你必须为A定义一个复制构造函数.这应该包括对TObjectList成员进行深层复制.否则,当您复制A对象时,您将使用指向同一TObjectList的两个对象,并且当第二个对象被销毁时您的程序将崩溃.