我遇到了一個錯誤。當我打電話刪除對象體系頂部的對象(希望能引起它的子對象的刪除),我的編程'退出,我得到這個:關於C++內存分配和刪除的問題
*** glibc detected *** /home/mossen/workspace/abbot/Debug/abbot: double free or corruption (out): 0xb7ec2158 ***
其次是什麼樣子了內存轉儲某種類型的。我已經搜索了這個錯誤,並且從我收集的內容中看到,當您嘗試刪除已被刪除的內存時似乎會發生這種錯誤。不可能,因爲在我的代碼中只有一個地方試圖刪除。這是古怪的部分:它不會在調試模式下發生。有問題的代碼:
Terrain::~Terrain()
{
if (heightmap != NULL) // 'heightmap' is a Heightmap*
{
cout << "heightmap& == " << heightmap << endl;
delete heightmap;
}
}
我註釋掉的高度圖析構函數的一切,還是這個錯誤。當發生錯誤時,
heightmap& == 0xb7ec2158
被打印。在調試模式下,我可以慢慢瀏覽代碼,並且
heightmap& == 0x00000000
被打印出來,並且沒有錯誤。如果我註釋掉'刪除高度圖';線,錯誤從未發生。上面的析構函數是從另一個析構函數調用的(單獨的類,沒有虛擬析構函數或類似的東西)。高度圖指針new'd在這樣的方法:
Heightmap* HeightmapLoader::load() // a static method
{
// ....
Heightmap* heightmap = new Heightmap();
// ....other code
return heightmap;
}
難道是與返回這是一個靜態方法的堆棧空間初始化的指針?我是否正確地進行刪除?有關我可以檢查或做得更好的任何其他提示?
是的,就是這樣。我確定heightmap *正在設置中(不是在構造函數中,而是在setter方法中),可惜它不是。謝謝,格雷格! – Mossen 2009-10-26 04:59:47
始終在構建過程中初始化所有指針。空指針可以安全地刪除(無操作)。如果你的構造函數在初始化列表中將指針設置爲0,那麼代碼從一開始就是正確的。 – 2009-10-26 06:43:56
當然,可能會有複製構造和/或分配,使兩個對象指向同一個內存區... – 2009-10-26 08:44:28