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

CCJ*_*CCJ 2 c++ memory-management stl vector

向量文档中可以看出,完全释放您具有类成员指针的值向量的正确方法如下所示:

std::vector<MyObject>* mvMyObjectVector_ptr;
...
//In the class constructor:
mvMyObjectVector_ptr = new std::vector<MyObject>();
Run Code Online (Sandbox Code Playgroud)

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

mvMyObjectVector_ptr->clear();
delete mvMyObjectVector_ptr;
Run Code Online (Sandbox Code Playgroud)

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

NPE*_*NPE 8

是的,它是正确的,只要mvMyObjectVector_ptr已经分配使用new.

另外,MyObject在可以使用之前需要满足某些要求std::vector.

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

一些可能的原因SIGABRT包括:

  • mvMyObjectVector_ptr尚未分配使用new;
  • MyObject违反三法则 ;
  • 包含向量的类违反了规则三.


Mar*_*ork 5

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

这行:

//In the class constructor:
Run Code Online (Sandbox Code Playgroud)

建议您在类中使用此函数,而不正确地执行三个规则

一个更好的主意是不要使用指向向量的指针。
只需将其声明为普通自动成员即可。

class MyClassContainingVector
{
     public: 
         std::vector<MyObject>          mvMyObjectVector;
                        //   ^^^^^ notice no pointer.
};
Run Code Online (Sandbox Code Playgroud)

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