OVH Cloud OVH Cloud

[Debutant] new et delete

4 réponses
Avatar
Michel
Bonsoir,
J'aimerais savoir si j'ai libéré toute la mémoire en faisant comme suit:

CmyClass* pt= new CmyClass;
...
CmyClass* pt1=pt;
....
delete pt1; //comme pt=pt1 ça suffit

C'est pour effacer un élément d'un arbre (informatique).
Merci pour vos remarques.
Michel

4 réponses

Avatar
Fabien LE LEZ
On Mon, 29 Dec 2003 01:52:20 +0100, Michel wrote:

J'aimerais savoir si j'ai libéré toute la mémoire en faisant comme suit:


Oui. A un new doit correspondre un delete et un seul ; et il en va de
même avec new[] et delete[].
Je ne connais pas d'exception à cette règle, mais le delete est
parfois (voire souvent) caché par des systèmes qui permettent de te
faciliter la vie (pointeurs intelligents, objets auto-destructeurs,
etc.)

NB : bien évidemment, le delete sur un pointeur peut être effectué à
deux endroits différents du code, l'important étant qu'un seul soit
effectué :

int* p= new int (5);
if (...)
{
...
delete p;
...
}
else
{
delete p;
}


--
;-)

Avatar
drkm
Fabien LE LEZ writes:

On Mon, 29 Dec 2003 01:52:20 +0100, Michel wrote:

J'aimerais savoir si j'ai libéré toute la mémoire en faisant comme
suit:


Oui. A un new doit correspondre un delete et un seul ; et il en va
de même avec new[] et delete[].


Je pense que la question, plus précisément, portait sur le fait
qu'il fallait faire un delete sur une seule des variables contenant
l'adresse de l'objet à détruire. Je vais donc expliciter un peu,
désolé si j'ai mal compris la question.

Un pointeur stocke l'adresse d'un objet. L'opérateur delete se sert
de cette adresse pour détruire l'objet. Un objet ne doit être détruit
qu'une fois. Donc si deux pointeurs ont la même valeur, il ne faut
utiliser delete que sur l'un deux. Après quoi les deux pointeurs
/pointent/ vers un objet déjà détruit.

À noter qu'un pointeur peut également contenir une adresse aléatoire
(non initialisé), ou un pointeur NULL (la valeur entière 0, auquel cas
delete est permis et n'a aucun effet), ou l'adresse d'un objet
automatique (auquel cas ne *pas* appliquer delete), comme dans
l'exemple suivant :

{
unType unObjet ;
unType * unPointeur = & unObjet ;
...
// ne *pas* appliquer delete !
}

--drkm


Avatar
Fabien LE LEZ
On 31 Dec 2003 03:21:03 +0100, drkm <fr.comp.lang.c++@fgeorges.org>
wrote:

Oui. A un new doit correspondre un delete et un seul ; et il en va
de même avec new[] et delete[].


Je pense que la question, plus précisément, portait sur le fait
qu'il fallait faire un delete sur une seule des variables contenant
l'adresse de l'objet à détruire.


J'y ai répondu : il y a un seul new, donc un seul delete. C'est aussi
simple que ça.

--
;-)


Avatar
drkm
Fabien LE LEZ writes:

On 31 Dec 2003 03:21:03 +0100, drkm <fr.comp.lang.c++@fgeorges.org>
wrote:

Oui. A un new doit correspondre un delete et un seul ; et il en
va de même avec new[] et delete[].


Je pense que la question, plus précisément, portait sur le fait
qu'il fallait faire un delete sur une seule des variables contenant
l'adresse de l'objet à détruire.


J'y ai répondu : il y a un seul new, donc un seul delete. C'est
aussi simple que ça.


Bien sûr. Mais vu la question, et surtout ce que j'en ai compris,
la précision me semblait importante, puisque le PO a l'air plutôt
largué à ce niveau.

--drkm