2014-11-05 126 views
1

我在类内部有一个const std::vector<double> *vecPtr。我想正确释放内存,那么我的destructor应该是什么样子?删除指向矢量的指针

我试过~ClassA() { delete[] vecPtr; },但我得到一个错误

*** Error in `./test': free(): invalid pointer: 0x00007fff8c643a98 *** 
Aborted (core dumped) 

是否delete[]工作只有矢量充满指针?

编辑:

我用vecPtr这样的:vecPtr = &vec;

如果我只使用delete我得到*** Error in ./test': double free or corruption (fasttop): 0x00000000008fcb20 ***

+0

指向矢量的指针几乎总是一个错误。尝试使用矢量。 – 2014-11-05 10:28:49

+0

这是为什么,我想避免复制 – TheGuyWithStreetCred 2014-11-05 10:33:25

+0

你不能避免通过在类成员前面粘贴'*'来进行复制。 – 2014-11-05 10:42:14

回答

5

这取决于你如何创建vecPtr。如果您使用vecPtr = new std::vector<double>,你应该使用delete vecPtr;

如果vecPtrarray new创建,如vecPtr = new std::vector<double>[3];,你应该使用array deletedelete[] vecPtr;

编辑

如果使用vecPtr = &vec;,如果vec是一个使用自动内存的自动变量,或者是一个静态变量或全局变量,它使用了静态内存,你不应该删除它,它会被自动解除分配LY。只有动态内存可以被删除。

4

删除[]。它用于删除数组。

delete vecPtr; 

您可能不应该使用指向vector的指针,因为没有太多理由。

0
const std::vector<double> *vecPtr 

vecPtr是指向“矢量”的指针,即单个对象。不要认为它是一个数组,而是使用数组删除调用(无论如何都是向后兼容的C数组),但将其视为它是一个指向对象的指针。

例如,如果你写你自己的Vector类,让我们把它叫做vecarray,那么你将有:

const vecarray *vecPtr. 

你会使用delete vecPtr显然删除。向量和其他stl容器类没有区别。

0

那么,你的编辑并没有真正澄清,实际上引入了更多的问题。 vec实际上是一个自动变量,因此永远不应该被删除?我们不知道。

要解答您的含义相当模糊的问题,如果您在免费商店中分配了一个矢量,应该只用delete ptr删除该矢量。如果您的ptr实际上指向一个数组,那么您应该使用delete [] ptr的数组删除。这至少显然不是这种情况。如果您只是将矢量地址分配给ptr,那么您应该永远不要删除它。像这样的所有权相互混淆引起了一系列问题。