Je compile (g++ 3.4.2), j'exécute et j'obtiens un comportement étrange,
notifié par Valgrind ("Invalid free() / delete...") :
vincent@sherlock:~/tmp$ valgrind ./op
==10368== Memcheck, a memory error detector for x86-linux.
==10368== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.
==10368== Using valgrind-2.2.0, a program supervision framework for
x86-linux.
==10368== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.
==10368== For more details, rerun with: -v
==10368==
==10368== Invalid free() / delete / delete[]
==10368== at 0x1B905616: operator delete(void*) (vg_replace_malloc.c:156)
==10368== by 0x8048698: B::~B() (op.cpp:18)
==10368== by 0x804866D: main (op.cpp:30)
==10368== Address 0x1BB5C060 is 0 bytes inside a block of size 4 free'd
==10368== at 0x1B905616: operator delete(void*) (vg_replace_malloc.c:156)
==10368== by 0x8048698: B::~B() (op.cpp:18)
==10368== by 0x8048639: main (op.cpp:30)
==10368==
==10368== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 1)
==10368== malloc/free: in use at exit: 4 bytes in 1 blocks.
==10368== malloc/free: 2 allocs, 2 frees, 8 bytes allocated.
==10368== For a detailed leak analysis, rerun with: --leak-check=yes
==10368== For counts of detected errors, rerun with: -v
Bizarrement, lorsque j'enlève la ligne "b1 = b2", tout se passe normalement
(pas de fuite mémoire, pas de problème de delete(), etc.). Dans les deux
cas, l'exécution ne provoque aucune erreur (mis à part le message de
Valgrind dans le premier cas).
J'ai un peu de mal à comprendre ce qu'il se passe, ce code étant pourtant
parfaitement valide, peut-être que quelqu'un ici pourra m'éclairer...
Je soupçonne un bug de Valgrind mais je voudrais être sûr.
Merci d'avance pour vos réponses.
Vincent
--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/
Il est donc obligatoire d'implanter operator=() dans toutes les classes (et pas seulement sur A) ? (même si c'est juste un appel à A::operator=)
je pense que c'est à cause de la valeur de retour qui est différente (A& et B&) et donc l'opérateur = est considéré comme non défini par ton compilo, donc il le fait.
Est-ce exact ?
Merci.
Vincent
-- vmime, une bibliothèque C++ sous licence GPL pour parser et générer des messages au format MIME : http://www.sourceforge.net/projects/vmime/
Il est donc obligatoire d'implanter operator=() dans toutes les
classes (et pas seulement sur A) ? (même si c'est juste un appel
à A::operator=)
je pense que c'est à cause de la valeur de retour qui est différente (A& et
B&) et donc l'opérateur = est considéré comme non défini par ton compilo,
donc il le fait.
Est-ce exact ?
Merci.
Vincent
--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/
Il est donc obligatoire d'implanter operator=() dans toutes les classes (et pas seulement sur A) ? (même si c'est juste un appel à A::operator=)
je pense que c'est à cause de la valeur de retour qui est différente (A& et B&) et donc l'opérateur = est considéré comme non défini par ton compilo, donc il le fait.
Est-ce exact ?
Merci.
Vincent
-- vmime, une bibliothèque C++ sous licence GPL pour parser et générer des messages au format MIME : http://www.sourceforge.net/projects/vmime/