删除指向矢量的指针

时间:2014-11-05 10:16:06

标签: c++ pointers vector delete-operator

我在课堂上有一个const std::vector<double> *vecPtr。我想正确地释放内存,那么destructor应该是什么样的?

我尝试了~ClassA() { delete[] vecPtr; },但我收到了错误

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

delete[]仅在向量填充指针时才起作用吗?

编辑:

我这样使用vecPtrvecPtr = &vec;

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

4 个答案:

答案 0 :(得分:6)

这取决于您创建vecPtr的方式。如果您使用vecPtr = new std::vector<double>,则应使用delete vecPtr;

如果vecPtr创建了array new,例如vecPtr = new std::vector<double>[3];,则应使用array deletedelete[] vecPtr;

修改

如果您使用vecPtr = &vec;,并且vec是自动变量(使用自动内存),或vec是静态变量或全局变量(使用静态内存),则应使用不删除它,它将自动解除分配。只能删除动态内存。

答案 1 :(得分:4)

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

delete vecPtr;

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

答案 2 :(得分:1)

const std::vector<double> *vecPtr

vecPtr是指向“向量”的指针,即单个对象。不要把它想象成一个数组并使用数组删除调用(无论如何都是向后兼容的C数组),但是把它想象成它是一个指向对象的指针。

例如,如果您已经编写了自己的矢量类,那么我们将其称为vecarray,那么您将拥有:

const vecarray *vecPtr.

您显然会使用delete vecPtr删除此内容。向量和其他stl容器类也不例外。

答案 3 :(得分:0)

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

尽管如此,如果您在免费商店中分配了一个向量,则应该使用delete ptr删除它。如果您的ptr实际指向数组,那么您应该使用delete [] ptr进行数组删除。至少显然不是这种情况。如果您只是将矢量的地址分配给ptr,那么您可能永远不会删除它。将所有权混为一谈会导致问题狂欢。