Je suis donc habitué à la gestion de la mémoire en C où free(pointer)
va libérer tout l'espace pointé par pointer
. Maintenant, je m'embrouille en essayant de faire quelque chose de simple en C++.
Si j'ai un tableau 2D de doubles alloué d'une manière similaire à celle-ci
double** atoms = new double*[1000];
for(int i = 0; i < 1000; i++)
atoms[i] = new double[4];
quelle serait la bonne méthode pour libérer la mémoire sur le tas alloué par new?
Mes pensées étaient à l'origine ceci (parce que mon cerveau pensait en C):
for(int i = 0; i < 1000; i++)
delete atoms[i];
delete atoms;
Mais j'avais oublié l'existence du delete[]
opérateur donc je crois que la bonne méthode est la suivante:
for(int i = 0; i < 1000; i++)
delete[] atoms[i];
delete[] atoms;
Est-il important de comprendre la différence entre delete
et delete[]
les opérateurs? Ou puis-je simplement supposer que chaque fois que j'alloue un tableau avec ptr = new x[]
Je dois aussi le désallouer avec delete[] ptr
?
En réalité, un tableau de pointeurs pointé par un pointeur est toujours un tableau de types de données ou de nombres intégraux pour contenir les adresses de mémoire. Tu devrais utiliser delete[]
pour les deux.
Aussi, oui, un new[]
implique un delete[]
.
Lorsque vous créez un tableau de tableaux, vous créez en fait un tableau de nombres qui contiennent l'adresse de mémoire d'un autre tableau de nombres . Quoi qu'il en soit, ce sont tous deux des tableaux de nombres, donc supprimez les deux avec delete[]
.
http://coliru.stacked-crooked.com/a/8a625b672b66f6ce
#include <iostream>
int main() {
//Hey, pointers have a finite size, no matter the indirection level!
std::cout << "sizeof(int*): " << sizeof(int*) << std::endl;
std::cout << "sizeof(int**): " << sizeof(int**) << std::endl;
std::cout << "sizeof(int***): " << sizeof(int***) << std::endl;
//Create an array of pointers that points to more arrays
int** matrix = new int*[5];
for (int i = 0; i < 5; ++i) {
matrix[i] = new int[5];
for (int j = 0; j < 5; ++j) {
matrix[i][j] = i*5 + j;
}
}
//Print out the matrix to verify we have created the matrix
for (int j = 0; j < 5; ++j) {
for (int i = 0; i < 5; ++i) {
std::cout << matrix[j][i] << std::endl;
}
}
//Free each sub-array
for(int i = 0; i < 5; ++i) {
delete[] matrix[i];
}
//Free the array of pointers
delete[] matrix;
return 0;
}