2011-12-07 60 views
2

GDB回溯:段错误删除

#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 

我敢肯定,我都有这个毛病,但我已经尝试了几种不同的方法在那里调用delete,但似乎没有编译除了上述。有什么问题?

回答

7

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

1

faceIndicesPerVertex不是一个指针,它被分配在堆栈上。你不能删除它,你不必。

2

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

拨打new时拨打delete,反之亦然。对于new[]delete[]也是如此。

3

首先,faceIndicesPerVertex不是一个数组,所以你不能拨打delete[]

而第二个,faceIndicesPerVertex是一个局部变量。这意味着它在堆栈上。这意味着你不能使用delete

只有在new堆中分配的对象上使用delete

1

faceIndicesPerVertex不是指针,所以delete[]不是必需的。因为delete[]甚至不会工作。

1

就我所知,delete仅用于从堆中释放内存。您不能使用delete删除堆栈分配的内存。一般而言,delete内存仅在您使用new动态分配内存时使用。我也有一些使用new/delete的问题。如果你遵循成对使用newdelete的一般规则,你应该没问题。