Bonjour,
J'ai créé une classe Article qui contient un pointeur sur une zone mémoire alloué.
Par propreté, j'ai donc créé un opérateur de destruction de cette zone pour éviter de bloquer la mémoire lorsque ces objets ne sont plus utilisé :
Code :
- class Article
- {
- ~Article()
- {
- delete [] tabdoub;
- }
- double* tabdoub;
- }
|
J'ai également créé un opérateur d'égalité afin de créer un objet "Article" de contenu identique à un autre.
Pour cela, bien évidemment, j'ai une boucle qui parcourt le tableau tabdoub et recopie tous ses éléments dans le nouvel objet :
Code :
- void Article::operator=(Article art_orig)
- {
- //recopie des éléments du tableau tabdoub de art_orig
- // après l'allocation dynamique nécessaire
- }
|
Tous cela fonctionne bien jusqu'à la fin de l'opérateur. Mais valgrind m'a signalé une erreur qui m'a échapé. En effet, par exemple, si dans le code, j'écris :
Code :
- Article art1,art2;
- ...
- art2 = art1;
|
L'article art2 devient bien une copie de art1, mais, à la fin de l'appel à cet opérateur d'égalité, dans la procédure de recopie, le destructeur ~Article est appelé pour détruire la copie de art1 passé en argument de l'opérateur d'égalité (ie. art_orig). Ce destructeur détruit alors la zone alloué au tableau tabdoub de art_orig qui se trouve être la même que celle de art1 ! Ainsi, le contenu du tableau de art1 est également une zone mémoire effacée car elle est indentique à celle de art_orig !
Comme éviter ce problème ? Je souhaiterais quand même, par propreté, conserver ce destructeur qui est, normalement, nécessaire.
J'espère avoir été à peu près clair dans mes explications.
Cordialement