我在课堂上有一个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 :(得分:6)
这取决于您创建vecPtr
的方式。如果您使用vecPtr = new std::vector<double>
,则应使用delete vecPtr;
如果vecPtr
创建了array new
,例如vecPtr = new std::vector<double>[3];
,则应使用array delete
,delete[] 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
,那么您可能永远不会删除它。将所有权混为一谈会导致问题狂欢。