[英]stl vector memory management
我正在使用 borland 2006 c++,并有以下代码。 我正在使用向量,并且无法理解为什么不调用析构函数。
基本上我有一个 class 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() 中超出 scope 时,它应该破坏它包含的元素,所以应该调用 A 的析构函数。 我在 ~A() 处有一个断点,但从未被调用,我也尝试过 resize() 和擦除方法
TIA
vec 在超出 scope 时确实会破坏它的元素。这里的问题是 vec 的元素是指向A 对象的指针,而不是 A 对象本身。 如果你反而做了
vector<A> vec;
vec.push_back(A(1));
vec.push_back(A(2));
...那么事情就会如你所愿。
ETA:不过请注意,如果你这样做,你必须为 A 定义一个复制构造函数。这应该涉及对 TObjectList 成员进行深层复制。 否则,当您复制 A object 时,您将得到两个指向同一个 TObjectList 的对象,并且当第二个 object 被销毁时,您的程序将崩溃。
未调用A
的析构函数,因为您没有A
的向量。 您有一个指向A
的指针向量,并且调用了指针的析构函数。 指针没有析构函数,所以什么也不会发生。
删除所有内容的一种方法是手动执行类似
while (!vec.empty())
{
delete vec.back();
vec.pop_back();
}
已经有很多好的答案,但我会再添加一个:
使用来自Boost Pointer Container Library的boost::ptr_vector ,而不是 std::vector。 当 vector 超出 scope 时,它将删除对象,从而调用析构函数。
获取 Boost 库,在上面任何有原始指针的地方,都可以使用 boost::shared_ptr<> 代替。 (好吧,不在 main() 的签名中。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.