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
我确定我有这个错误,但我已经尝试了几种不同的方法来调用删除,但除了上面之外似乎没有编译。有什么问题?
答案 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[]
faceIndicesPerVertex
是vector
,因此delete[]
甚至无效。
答案 5 :(得分:1)
据我所知,delete
仅用于从堆中释放内存。您无法使用delete
删除堆栈分配的内存。作为一般规则,delete
内存仅在您使用new
动态分配时才使用。我对new/delete
的使用也遇到了一些问题。如果您遵循成对使用new
和delete
的一般规则,那么您应该没问题。