Supprimer un pointeur de pointeur (sous forme de tableau de tableaux)
J'ai ceci dans mon code:
double** desc = new double* [size_out];
for (int i = 0; i < size_out; i++)
desc[i] = new double [size_in];
Comment puis-je supprimer ce 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;
?
- Jetez un oeil ici: stackoverflow.com/questions/340943/...
Vous devez vous connecter pour publier un commentaire.
Règles simples à suivre:
new
doit être libérée à l'aidedelete
, à l'aide denew[]
doit être libéré à l'aide dedelete[]
et à l'aide demalloc
doit être libéré à l'aide defree
(ex3 est donc faux)Conclusion, ex2 est OK.
Votre code ne compile pas. Le type d'un tableau la nouvelle expression est un pointeur vers le type de l'élément de tableau en cours de création (la valeur est un pointeur vers le premier élément de l'array).
De sorte que le type de
new double**[size_out]
estdouble ***
.Chaque fois que vous utilisez le tableau de la forme de nouvelles, vous devez utiliser la forme matricielle de supprimer, même si vous ne allouer un tableau de taille.
Remarque que vous n'avez toujours pas alloué de la
double
, juste des pointeurs.Avez-vous vraiment envie que cette place?
Votre suppression devrait être le reflet de votre allocation.
Depuis que vous avez utilisé
new []
pour allouer de l'extérieur tableau, etnew []
(dans une boucle) à allouer à l'intérieur des tableaux, faire de même pour la suppression. C'est: votre deuxième solution est correcte;delete []
l'intérieur des tableaux dans une boucle, et enfin, de l'extérieur tableau viadelete []
aussi.Cela dit, un (beaucoup, beaucoup) la meilleure solution en C++ serait d'utiliser un imbriquée
std::vector
:Solution 2 est la bonne : chaque cellule points d'un tableau alloué dynamiquement qui devraient être supprimés à l'aide de
delete[]
. Enfin,le
desc
tableau lui-même devrait être supprimé à l'aide dedelete[]
.Bonus solution 4 : éviter à l'aide de tableaux et de passer à
std::vector<std::vector<double> >
.Je ne
pour chaque tableau alloué avec
new []
, vous avez un correspondantdelete []
.Et comme Rupdolph dit: cesser d'utiliser le C-tableaux, et commencer à l'utiliser
std::vector
. Vous aurez moins de bugs (cent fois moins de bugs).