OVH Cloud OVH Cloud

[g++/Valgrind] Problème étrange

11 réponses
Avatar
Vincent Richard
Bonsoir,

Voici un extrait de code très simple (et totalement inutile) :

================================================
struct A
{
virtual ~A() { }

A& operator=(const A& a)
{
f();
return (*this);
}

virtual void f() = 0;
};

struct B : public A
{
B() { p = new int; }
~B() { delete (p); }

void f() { }

int* p;
};

int main()
{
B b1;
B b2;

b1 = b2;
}
================================================

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/

1 réponse

1 2
Avatar
Alexandre
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/


1 2