完全释放std :: vector容器的内存

时间:2013-03-11 19:45:02

标签: c++ memory-management vector stl

vector docs看来,正确的方法是完全释放你有一个类成员指针的值向量,例如:

std::vector<MyObject>* mvMyObjectVector_ptr;
...
//In the class constructor:
mvMyObjectVector_ptr = new std::vector<MyObject>();

将在类的析构函数实现中按顺序调用以下内容

mvMyObjectVector_ptr->clear();
delete mvMyObjectVector_ptr;

然而,这似乎导致SIGABRT&#39;指针被释放未被分配&#39;错误。上面的成语是完全释放保存在指向向量的指针所指向的地址的内存的正确方法(如果是,我认为我的错误来自其他东西)?如果没有,那么正确的方法是什么?

4 个答案:

答案 0 :(得分:7)

是的,这是正确的,提供mvMyObjectVector_ptr已使用new 分配。

此外,MyObject需要满足某些要求才能与std::vector一起使用。

clear()的调用是多余的,可以省略。

SIGABRT的一些可能原因包括:

    尚未使用mvMyObjectVector_ptr; 分配
  • new
  • MyObject违反Rule of Three;
  • 包含向量的类违反了规则三。

答案 1 :(得分:4)

我认为你的问题在于你向我们展示的代码。

这一行:

//In the class constructor:

建议您在课堂内使用此功能,未正确实施三个规则。

更好的想法是不使用指向矢量的指针 只需将其声明为普通的自动成员即可。

class MyClassContainingVector
{
     public: 
         std::vector<MyObject>          mvMyObjectVector;
                        //   ^^^^^ notice no pointer.
};

现在它将被正确地自动创建和销毁 您的构造函数或析构函数都不需要任何代码来管理此对象。

答案 2 :(得分:2)

是的,通过调用std::vector动态分配new对象并通过调用delete调用其破坏将导致内部用于保存其元素的内存被释放。

然而,遵循RAII idiom并使用具有自动存储持续时间的对象会更简单,更可靠:

{
    std::vector<MyObject> myVector;
    ...
} // <-- memory is freed here

当执行离开此范围时(请注意,它也可能由抛出异常等引起),可以保证myVector对象将被销毁并释放内存。

答案 3 :(得分:0)

通常不应将向量保持为动态分配的指针。它们应该只是您班级的成员变量,在大多数情况下 (尽管总有例外)。如果 指针由“new”分配,并且简单的“delete”应该工作。

向量处理内存分配,所以你不必这样做。但是,如果你想真正释放向量中保存的所有存储内存,即使它在堆栈中,也有一个新功能。

因为vector。reserve()只扩展内存,但从不缩小内存,所以在C ++ 11中添加了一个新函数来释放保留的内存:vector。shrink_to_fit( )。实现并可以随心所欲地执行它们,但是你基本上要求实现释放内存,所以他们应该以合理的方式回答请求。

您可以通过以下方式真正清除矢量:

vector.clear(); //Erases the elements.
vector.shrink_to_fit(); //Erases the memory no longer needed by the elements.

为什么向量保持记忆的原因是出于性能原因,所以你应该这样做只有你真正理解为什么他们有记忆保留,并且愿意处理(或者知道你不必处理)微观管理内存所带来的任何性能命中。