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.
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:
is for deleting one-dimensional dynamically allocated array - used to delete "rows" and "columns" above.
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.
The right method is
for(int i = 0; i < 100; i++)
delete [] myArray[i];
delete [] myArray;