Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deallocating memory in a 2D array

Suppose we have:

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

What is the appropriate way to deallocate this array (which method below, if either is a correct way to do so)?

1.

delete[] myArray;

2.

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

Intuitively it seems like we should do something like 2. since we want all of the memory we allocated to be deleted, but I'm not sure.

like image 422
gdagger Avatar asked Dec 24 '22 13:12

gdagger


2 Answers

You used one loop to create it, you should use one loop to delete it. The order is reversed to the order of allocation:

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

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

Moreover:

  1. is for deleting one-dimensional dynamically allocated array - used to delete "rows" and "columns" above.

  2. only resembles how one would delete a 2D array of pointers e.g.:

    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)
    

    You can see the "reversed" nature of it.

like image 101
LogicStuff Avatar answered Jan 04 '23 22:01

LogicStuff


The right method is

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

delete [] myArray;
like image 28
Mykola Avatar answered Jan 05 '23 00:01

Mykola