2016-12-22 2 views
0

Je me demandais si l'un d'entre vous pouvait confirmer que je supprimais correctement de la mémoire allouée dynamiquement.C++ Effacer correctement la mémoire allouée dynamiquement

Le TileWrapper ci-dessous est initialisé comme un tableau 2D de pointeurs:

private: 
    TileWrapper*** mLayout; 

J'ai simplifié son initialisation pour vous montrer les parties importantes:

void generateLayout() { 
    mLayout = new TileWrapper**[mRows]; 
    for(int i = 0; i < mRows; i++) { 
     mLayout[i] = new TileWrapper*[mColumns]; 
    } 
    for(int i = 0; i < mRows; i++) { 
     for(int j = 0; j < mColumns; j++) { 
      mLayout[i][j] = new TileWrapper(); 
     } 
    } 
} 

La partie que j'ai besoin confirmé est la destruction, montrée ci-dessous:

~Destructor() { 
    for (int i = 0; i < mRows; i++) { 
     for (int j = 0; j < mColumns; j++) { 
      delete mLayout[i][j]; 
     } 
     delete[] mLayout[i]; // CONFIRM THIS 
    } 
    delete[] mLayout; // CONFIRM THIS 
} 

Je suis particulièrement préoccupé par la suppression s qui ont // CONFIRMER CETTE suite en raison des caractères []. Mon code est-il étanche à la mémoire? Merci.

+1

Oui, il semble être étanche à la mémoire. Vous pouvez le vérifier en utilisant des outils de vérification de la mémoire comme Valgrind ou DrMemory – Hugal31

+6

'std :: vector'. Vérifiez-le. Il a deux décennies maintenant. – molbdnilo

+0

@molbdnilo Je suis conscient, je ne voulais pas l'utiliser car je n'ai pas besoin des fonctions qui vont avec. – Anthroyd

Répondre

0

Il est sûr et sain en ce qui concerne le code affiché concerné. La confusion peut provenir de la deuxième boucle for qui est utilisée. Il est en fait un équivalent de

for(int i = 0; i < mRows; i++) { 
    for(int j = 0; j < mColumns; j++) { 
     *(*(mLayout + i) + j) = new TileWrapper(); 
    } 
} 

La construction avec triple pointeur a un inconvénient connu même dans le temps de K & R: il est pas garanti d'occuper la zone monolithique de mémoire parce que vous allouez chaque « colonne » séparément votre code, donc ce n'est pas un tableau multidimensionnel de pointeurs par modèle de mémoire, qui devrait être déclaré aux utilisateurs de ce "tableau". En C++, il n'est pas possible d'allouer un tableau entier en une seule fois et d'utiliser des sous-scripts sans créer de types de gabarits auxiliaires ou redéfinir l'opérateur []