2011-12-07 70 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的一般規則,你應該沒問題。