2016-12-22 54 views
0

我想知道你們中的一個人是否可以確認我正確地刪除了一些動態分配的內存。C++正確地刪除動態分配的內存

的TileWrapper下面被初始化爲指針的二維數組:

private: 
    TileWrapper*** mLayout; 

我已經簡化初始化向您展示的重要組成部分:

void generateLayout() { 
    mLayout = new TileWrapper**[mRows]; 
    for(int i = 0; i < mRows; i++) { 
     mLayout[i] = new TileWrapper*[mColumns]; 
    } 
    for(int i = 0; i < mRows; i++) { 
     for(int j = 0; j < mColumns; j++) { 
      mLayout[i][j] = new TileWrapper(); 
     } 
    } 
} 

,我需要確認的部分是破壞如下圖所示:

~Destructor() { 
    for (int i = 0; i < mRows; i++) { 
     for (int j = 0; j < mColumns; j++) { 
      delete mLayout[i][j]; 
     } 
     delete[] mLayout[i]; // CONFIRM THIS 
    } 
    delete[] mLayout; // CONFIRM THIS 
} 

我特別關心刪除因爲[]字符,//後面有//確認這個。是我的代碼內存泄漏證明?謝謝。

+1

是的,它似乎是內存泄漏證明。您可以使用內存檢查工具(如Valgrind或DrMemory – Hugal31

+6

'std :: vector')來檢查它。一探究竟。到目前爲止已有二十年的歷史。 – molbdnilo

+0

@molbdnilo我知道,我不想使用它,因爲我不需要任何附帶的功能。 – Anthroyd

回答

0

就顯示的代碼而言,它是安全和可靠的。混淆可能出現在使用的第二個循環中。它實際上是

for(int i = 0; i < mRows; i++) { 
    for(int j = 0; j < mColumns; j++) { 
     *(*(mLayout + i) + j) = new TileWrapper(); 
    } 
} 

等效三重指針的建設得到了即使以K &的R時已知的一個缺點:它不能保證佔用的內存單片面積,因爲你分配的每個「列」分別在你的代碼,所以它不是內存模型的多維指針數組,它應該向這個「數組」的用戶聲明。 在C++中,不可能一次性分配整個數組,並且不使用輔助模板類型或重新定義運算符來爲其使用下標[]