2013-01-20 164 views
0

我正在使用雙指針,但是當我嘗試刪除它時,它會導致堆損壞:CRT檢測到應用程序在堆結束後寫入內存。據「崩潰」的對象的析構函數中:刪除雙指針導致堆損壞

Map::~Map() 
{ 
    for(int i = 0; i < mTilesLength; i++) 
     delete mTiles[i]; 

    delete[] mTiles; 
} 

mTiles聲明是這樣的:

Tile **mTiles = NULL; 
mTiles = new Tile *[mTilesLength]; 

for(int i = 0; i < mTilesLength; i++) 
    mTiles[i] = new Tile(...); 

如果顯着mTiles是「磚」的對象,從對象「雪碧」繼承所有3個析構函數都被設置爲虛擬(地圖,磁貼,精靈),並不確定這是否有所作爲,但似乎直到現在才起作用。

+6

您的班級是否遵循三項規則? – chris

+3

你能構建一個最小化的完整測試用例來證明這個問題嗎?你發佈的代碼沒有問題,所以問題在於別處。 – NPE

+2

FWIW,您顯示的語法是正確的。 –

回答

1

您發佈的代碼似乎沒有任何問題。我創建從它包含了一個簡單的,自我,編譯(正確)例如:

struct Tile {int x; Tile():x(7) {}}; 

struct Map { 
    Tile **mTiles; 
    int mTilesLength; 
    Map(int TilesLength_); 
    ~Map(); 
}; 
Map::~Map() 
{ 
    for(int i = 0; i < mTilesLength; i++) { 
    delete mTiles[i]; 
    } 

    delete[] mTiles; 
} 
Map::Map(int TilesLength_): 
    mTiles(), 
    mTilesLength(TilesLength_) 
{ 
    mTiles = new Tile *[mTilesLength]; 

    for(int i = 0; i < mTilesLength; i++) { 
    mTiles[i] = new Tile(); 
    } 
} 
int main() { 
    Map* m = new Map(1000); 
    delete m; 
} 

compiled and ran it < - 鏈接,並沒有什麼不好被發現。

你的問題在於你沒有與我們分享的代碼。爲了找到導致問題的代碼並提出正確的問題,請到這裏:http://sscce.org/

然後拿起你的代碼,並開始修剪零件,直到代碼變得簡單,但仍然顯示你的堆損壞。在修剪掉不相關的代碼時保留每個版本的副本,這樣您就不會跳過問題發生的部分(這是您希望版本控制系統即使在您的個人項目上的許多原因之一)。

+0

用於提及VCS –