2 votes

Erreur de fonction de destruction C++!

J'ai écrit un programme qui ne fonctionne pas correctement. Le problème est que lorsque je détruis le pointeur, tout va de travers.

le code est le suivant:

if(pImage)
    delete pImage;

mais si j'utilise ce code, ça peut fonctionner correctement.

    if(!pImage)
    delete pImage;

Peux-tu expliquer les raisons ? Merci !

1voto

Xeo Points 69818

Le deuxième exemple ne fonctionnera certainement pas correctement - du moins pas de la manière correcte que vous souhaitez qu'il soit.
Si pImage est une valeur non nulle, l'instruction delete ne sera pas exécutée. Cela peut compiler et fonctionner correctement, mais vous avez une fuite de mémoire (et éventuellement d'autres ressources). Votre problème est très probablement une double-suppression, c'est-à-dire la suppression d'un pointeur deux fois.

0voto

Let_Me_Be Points 16797

Parce que vous ne modifiez pas pImage. C'est pourquoi. pImage pointe toujours quelque part, mais maintenant la mémoire vers laquelle il pointe a déjà été détruite.

0voto

Willow Points 941

Ta première version if(pImage) delete pImage;

vérifie si le pointeur est là. Comme tu l'as déclaré, ça fonctionnera bien. Tu devrais le définir sur NULL lorsque tu le déclares c'est-à-dire pImage = NULL; de sorte que si le pointeur ne pointe vers rien, la ligne sera ignorée. Au cas où quelque chose serait alloué, la ligne ci-dessus va (si l'instruction devient vraie) désallouer la mémoire qui lui a été allouée. N'oublie pas que pImage doit être une mémoire allouée DYNAMIQUEMENT et qu'après le delete, ELLE NE DOIT JAMAIS ÊTRE ACCÉDÉE sinon une erreur sera générée à nouveau.

ta deuxième version if(!pImage) delete pImage

est logiquement incorrecte. Cela signifie que SI pImage n'existe pas, supprime-le donc cette instruction IF devient fausse. Par bonne pratique, si tu avais rendu ce pointeur NULL, cela t'aurait donné une erreur ici étant donné que c'est logiquement incorrect. TU dis SI pImage N'EXISTE PAS, SUPPRIME-LE !!!!!!! Donc la ligne va probablement être ignorée quand elle aura alloué de la mémoire.

(LE VRAI PROBLÈME EST QUE TU DEVRAIS TOUJOURS DÉFINIR UN POINTEUR SUR NULL lors de sa déclaration. Fais ça, et tu es bon pour continuer.

0voto

aeon Points 931

Si vous avez alloué de la mémoire pour pImage en utilisant new, alors delete pourrait fonctionner; mais si vous avez alloué de la mémoire en utilisant malloc() ou si le pointeur pointe vers une autre mémoire non allouée avec new, alors vous rencontrez des problèmes lorsque vous appelez delete.

Veuillez répondre sur la manière dont vous avez initialement alloué la mémoire pour pImage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X