我有std::vector
Element*
。何时会调用析构函数。
如果它是Element
std::vector<Element*> vect;
..
struct Element
{
Record *elm;
Element(Record *rec)
{
elm = new Record();
//...copy from rec
}
~Element()
{
delete elm;
}
};
我使用的载体如下:
Element *copyElm = new Element(record);
vect.push_back(copyElm);
在上面的代码中,我怎样才能确保没有泄漏。
答案 0 :(得分:3)
您可以在数组中使用引用计数指针包装类,只要没有对它们的引用,这些项就会自动删除。其中一个类是boost::shared_ptr
。您也可以在一些编译器的c ++库中找到它,因为它被添加到C ++的未来版本中。
std::vector<boost::shared_ptr<Element> > vect;
这些类包装operator ->
等,所以你可以使用大多数使用普通指针的方法。
http://www.boost.org/doc/libs/1_45_0/libs/smart_ptr/shared_ptr.htm
答案 1 :(得分:2)
每当您自己释放class Element
实例时。向量将释放向量元素(指针),但不释放指向的class Element
对象。毕竟,向量无法知道您是否有其他指向同一对象的指针。
答案 2 :(得分:1)
vector
将调用释放它所持有的对象的内存(即指针),但不会释放指向的对象的内存。您需要自己释放Element
对象的内存。如果它是vector<Element>
,那么无论何时执行push_back
,该元素的副本都会插入到向量中。 vector
保证会释放分配给此复制对象的内存。但请注意,Element
的当前定义会导致seg错误,因为您尚未定义复制ctor和赋值运算符。
修改强>
如果由于某种原因不想使用智能指针,那么只有选项是编写一个release
函数,该函数遍历整个向量并调用存储指针上的delete
。
答案 3 :(得分:1)
在Element
的向量中,析构函数称为 lot 。无论何时分配节点,向量的大小都是向下的,向量必须在内存中移动,或者向量超出范围/被销毁,在元素被更改/丢弃之前会在元素上调用析构函数。此外,调用复制构造函数进行赋值,并调用默认构造函数来初始化每个条目。对这样的矢量进行排序将涉及大量的复制和破坏。
在Element*
的向量中,除非您自己致电delete
,否则永远不会调用它。
请查看Boost shared_ptr
以获取更合适的解决方案,或unique_ptr
如果您的编译器具有相对较新的功能。
答案 4 :(得分:0)
销毁指针始终是无操作,并且有several good reasons why。