2013-03-11 109 views
1

vector docs它会出现适当的方式彻底解除分配值的载体,你有一个类成员指针如:完全重新分配一个std的内存:: vector容器

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

会可以调用以下,为了在类的析构函数实现

mvMyObjectVector_ptr->clear(); 
delete mvMyObjectVector_ptr; 

然而,这似乎是导致SIGABRT“指针被释放没有分配”的错误。上述习惯用法是完全释放指向矢量指向的地址处的内存的正确方法(如果是这样,我假设我的错误来自其他东西)?如果不是,那么正确的方法是什么?

+3

看到指向动态分配向量的指针是很常见的。使用这种数据结构的好处之一就是将您从手动内存操作中解放出来。 – juanchopanza 2013-03-11 19:47:52

+3

我认为在幕后我们没有被展示的是“三条法则”的违反。 – 2013-03-11 19:48:16

+2

不要动态分配自动变量会做什么(摆脱新/删除)。不需要调用clear(),因为析构函数会这样做。 – 2013-03-11 19:48:29

回答

7

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

此外,MyObject需要满足一定的要求,才可以使用std::vector

致电clear()是多余的,可以省略。

SIGABRT一些可能的原因包括:

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

矢量指针正在通过新分配(请参阅我的编辑后)。删除操作符会自动销毁向量中的每个元素吗? – CCJ 2013-03-11 19:49:08

+0

@CCJ:是的,它没有。 – NPE 2013-03-11 19:49:50

+0

@CCJ:调用'delete'释放分配的内存,但也调用被删除对象的析构函数。 vector的析构函数调用元素的delete(或等价物),然后调用元素的析构函数,这可以释放*他们的资源,等等。 – 2013-03-12 03:34:02

4

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

这条线:

//In the class constructor: 

建议你使用这个类的内部和无法正确执行三个规则。

更好的主意不是使用指向矢量的指针。
只需将其声明为正常的自动成员即可。

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

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

2

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

但是它会更简单,更可靠的跟踪RAII idiom和使用对象与自动存储时间:

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

在执行离开此范围内(注意,这可能也引起引发异常等),保证myVector对象将被销毁,内存将被释放。

0

向量通常不应该保存为动态分配的指针。他们应该只是您班级的成员变量,在大多数情况下(尽管总是有例外)。如果他们指针分配的'新',而简单'删除'应该工作。

向量处理内存分配给你,所以你不必。然而,如果你想真正释放所有存储在存储器中的内存,即使它在堆栈中,也有一个新的功能。

因为矢量。 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. 

为什么载体守住自己的记忆的原因是出于性能的考虑,所以你只能这样做,如果你真的理解他们为什么在内存保留并且愿意处理(或者知道你将不必处理)由微管理存储器产生的任何性能命中。

相关问题