调用delete时出现分段错误

时间:2011-12-07 08:13:15

标签: c++ memory-management segmentation-fault

gdb backtrace:

#0  0x0040cea9 in free () from /lib/tls/i686/cmov/libc.so.6
#1  0x0033c741 in operator delete(void*) () from /usr/lib/libstdc++.so.6
#2  0x080654b6 in mesh::calculateMeanNormalsPerVertex (this=0x807d684)
    at /home/brent/Desktop/protCAD/src/math/mesh.cc:230
#3  0x0805638f in buildCubes (argc=4, argv=0xbffff3e4)
    at /home/brent/Desktop/protCAD/src/driver/executeCubes.cc:163
#4  main (argc=4, argv=0xbffff3e4)
    at /home/brent/Desktop/protCAD/src/driver/executeCubes.cc:297

声明并delete致电mesh.cc

vector<vector<int> > faceIndicesPerVertex (vertexArray.size());
...
delete[] &faceIndicesPerVertex;    //line 230

我确定我有这个错误,但我已经尝试了几种不同的方法来调用删除,但除了上面之外似乎没有编译。有什么问题?

6 个答案:

答案 0 :(得分:7)

您不需要delete任何堆栈分配的对象,包含堆栈分配的vector对象 - 当对象超出范围时,它将被销毁并且其内存将被回收。尝试delete堆栈分配的对象会导致未定义的行为(在您的情况下崩溃)。

答案 1 :(得分:3)

首先,faceIndicesPerVertex不是数组,因此您无法调用delete[]

第二,faceIndicesPerVertex是一个局部变量。这意味着它在堆栈中。这意味着您无法在其上使用delete

仅对使用delete在堆中分配的对象使用new

答案 2 :(得分:2)

您不必致电delete[]。它会自动分配变量/容器,它会自动销毁/释放内存。

致电delete时致电new,反之亦然。 new[]delete[]也是如此。

答案 3 :(得分:1)

faceIndicesPerVertex不是指针,它是在堆栈上分配的。你不能删除它,也不必删除它。

答案 4 :(得分:1)

faceIndicesPerVertex不是指针,因此不需要delete[] faceIndicesPerVertexvector,因此delete[]甚至无效。

答案 5 :(得分:1)

据我所知,delete仅用于从堆中释放内存。您无法使用delete删除堆栈分配的内存。作为一般规则,delete内存仅在您使用new动态分配时才使用。我对new/delete的使用也遇到了一些问题。如果您遵循成对使用newdelete的一般规则,那么您应该没问题。