1Fermer3
ZephLe 22/04/2008 à 11:24
C'est normal que 3 appels de destructeurs soient effectués, puisqu'il y a 3 créations d'objet :

- Le premier objet : img ("test.png")
- Le second, temporaire : Image ("autre.png")
- Le troisième, créé par copie : img = ...

En revanche, le problème est peut-être que ta classe contient des pointeurs, et que tu n'as pas redéfini d'opérateur de copie ou de constructeur par copie. Du coup les pointeurs sont simplement copiés (comportement par défaut), et tu as plusieurs appels à free sur la même zone mémoire lors de la destruction de tous ces objets clonés alors qu'il faudrait soit avoir un mécanisme de pointeurs "intelligents" (qui compte le nombre de références) soit dupliquer les zones mémoire pointées.

Les classes std::string et autres n'ont jamais ce problème puisque c'est tout simplement un bug (assez vicieux certes, mais courant en C++). Pour éviter d'avoir des surprises, le plus sûr est de toujours déclarer un constructeur par copie et un opérateur "=" vides quand tu crées une classe qui contient des pointeurs, comme ça si un jour ils sont utilisés par ton code (explicitement ou implicitement), tu auras une erreur puisqu'ils ne seront pas définis.