2010-11-16 6 views
25

J'ai dans mon code:Supprimer un pointeur vers pointeur (comme tableau de tableaux)

double** desc = new double* [size_out]; 
for (int i = 0; i < size_out; i++) 
    desc[i] = new double [size_in]; 

Comment puis-je supprimer cette desc?

Dois-je faire:

delete [] desc; 

ou

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete [] desc; 

ou

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete desc; 

?

+0

Jetez un oeil ici: http://stackoverflow.com/questions/340943/c-multi-dimensional-arrays-on-the-heap –

Répondre

16

Des règles simples à suivre:

  • pour chaque allocation, il doit y avoir une désaffectation (EX1 est donc faux)
  • ce qui a été alloué à l'aide new doit être libéré à l'aide delete, en utilisant new[] doit être désallouée en utilisant delete[] et en utilisant malloc devrait être à l'aide free deallocated (EX3 est donc faux)

Conclusion, EX2 est OK.

18

Votre suppression devrait refléter votre allocation.

Puisque vous avez utilisé new [] pour allouer le tableau externe, et new [] (dans une boucle) pour allouer les tableaux internes, faites de même pour la suppression. C'est: votre deuxième solution est correcte; delete [] les tableaux internes dans une boucle, et enfin le tableau externe via delete [] également.

Cela dit, un (beaucoup, beaucoup) meilleure solution en C++ serait d'utiliser un imbriquée std::vector:

// Declaration and initialization: 
vector<vector<double> > desc(size_out, vector<double>(size_in)); 

// No deletion! 
+1

+1 pour la solution de vecteur. –

+0

Merci, mais malheureusement, j'ai besoin d'utiliser ce double ** – yelo3

4

Je ferais

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete [] desc; 

pour chaque tableau alloué Avec new [], vous avez un delete [] correspondant. Editer: et comme Rupdolph dit: arrêtez d'utiliser C arrays, et commencez à utiliser std::vector. Vous aurez (je veux dire au centuple!) Moins de bugs.

5

La solution 2 est la bonne: chaque cellule pointe vers un tableau alloué dynamiquement qui doit être supprimé en utilisant delete[]. Enfin, le tableau desc devrait être supprimé en utilisant delete[].

Solution de bonus 4: évitez d'utiliser des matrices et passez à std::vector<std::vector<double> >.

17

Votre code ne doit pas être compilé.Le type d'une nouvelle expression de tableau est un pointeur vers le type d'élément de tableau en cours de création (la valeur est un pointeur vers le premier élément du tableau alloué). Le type de new double**[size_out] est double ***. Chaque fois que vous utilisez la forme de tableau de new, vous devez utiliser la forme array de delete même si vous n'allouez qu'un tableau de taille 1.

double*** desc = new double**[size_out]; 
for (int i=0; i<size_out; i++) 
    desc[i] = new double*[size_in]; 


for (int i=0; i<size_out; i++) 
    delete[] desc[i]; 

delete[] desc; 

Notez que vous avez toujours pas alloué une double, juste des pointeurs.

Vouliez-vous vraiment cela à la place?

double** desc = new double*[size_out]; 
for (int i=0; i<size_out; i++) 
    desc[i] = new double[size_in]; 

for (int i=0; i<size_out; i++) 
    delete[] desc[i]; 

delete[] desc; 
+0

+1 pour souligner le problème de discordance de type –

Questions connexes