2016-12-22 7 views
0

Мне было интересно, удалось ли одному из вас подтвердить, что я правильно удаляю некоторую динамически выделенную память.C++ Правильное удаление динамически распределенной памяти

TileWrapper ниже инициализируется как 2D массив указателей:

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 
} 

Я особенно обеспокоен удалением s, которые имеют // ПОДТВЕРДИТЬ ЭТО впоследствии из-за символов []. Является ли мой код памяти утечки доказательства? Благодарю.

+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++ невозможно выделить целые массивы за один проход И использовать для него индексы без создания типов вспомогательных шаблонов или переопределения оператора []