2015-10-10 5 views
4

Предположим, что мы имеем:освобождения памяти в 2D массив

int** myArray = new int*[100]; 
for(int i = 0; i < 100; i++){ 
    myArray[i] = new int[3]; 
} 

Что является подходящим способом освободить этот массив (какой метод ниже, если либо правильный способ сделать это)?

1.

delete[] myArray; 

2.

for(int i = 0; i < 100; i++){ 
    for(int j = 0; j < 3; j++){ 
     delete myArray[i][j]; 
    } 
} 
delete[] myArray; 

Интуитивно кажется, что мы должны сделать что-то подобное 2. так как мы хотим, чтобы вся память зарезервированное для удаления, но я не уверен.

+0

Просто использовать векторы - http://www.cplusplus.com/reference/vector/vector/ - он будет отсортирован без хлопот –

ответ

7

Вы использовали один цикл, чтобы создать его, вы должны использовать один цикл, чтобы удалить его. Порядок обратный порядка распределения:

for(int i = 0; i < 100; i++) 
    delete [] myArray[i];    // delete all "rows" in every "column" 

delete [] myArray;      // delete all "columns" 

Кроме того:

  1. для удаления одномерного массива динамически выделяемого - используется для удаления «строк» ​​и «столбцов» выше.

  2. только напоминает, как можно было бы удалить 2D массив указателей т.д .:

    int*** myArray = new int**[100]; // (1) 
    
    for(int i = 0; i < 100; i++) 
    { 
        myArray[i] = new int*[3];  // (2) 
    
        for(int j = 0; j < 3; j++) 
         myArray[i][j] = new int(); // (3) 
    } 
    
    for(int i = 0; i < 100; i++) 
    { 
        for(int j = 0; j < 3; j++) 
         delete myArray[i][j];  // (3) 
    
        delete [] myArray[i];   // (2) 
    } 
    
    delete [] myArray;     // (1) 
    

    Вы можете увидеть «обратный» характер этого.

+1

Вы демонтировать вещи в обратном порядке, вы построили их. – Persixty

2

Правильный метод является

for(int i = 0; i < 100; i++) 
    delete [] myArray[i]; 

delete [] myArray;