web-dev-qa-db-fra.com

Suppression d'un tableau 2D alloué dynamiquement

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?

10
Alex

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;
}
14
CinchBlue