在C ++中破坏Vector内容

时间:2011-02-18 04:29:59

标签: c++ stl

我有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);

在上面的代码中,我怎样才能确保没有泄漏。

5 个答案:

答案 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