je me pose pas mal de questions au sujet des destructeurs virtuels, de
l'opérateur delete []...
J'ai cru voir dans la norme que le comportement lorsqu'on l'utilise avec
du polymorphisme, le comportement n'est alors pas défini (contrairement
à l'operateur delete ) et cela me parait assez génant...
Par exemple, le code suivant donne des resultats différents entre intel
8.0 vc 6.0 sp6 et MingW gcc 3.3.3.
Les 3 derniers donnent un résultat à l'exécution qui me parait cohérent
(~B est bien apellé), le premier non (~B n'est JAMAIS apellé) et je
n'ose supposer que ce soit un bug du compilateur parce qu'alors ce
serait carrément énorme... Aurais-je donc bien interpreté la norme ? Je
trouve ça bizarre, pourquoi est-ce que le comportement serait défini
pour delete et pas pour delete [] ?
Tableaux d'objets et sous-classes ne font pas bon ménage. Après la conversion implicite dans: A* tabA = ::new B[2]; tout accès à tabA[1] conduirait à un comportement indéfini, car B et A peuvent ne pas avoir la même taille en mémoire. Donc delete[] ne peut pas fonctionner, et tout résultat est possible.
La solution? : il faut éviter les tableaux d'éléments polymorphiques, et utiliser des tableaux de pointeurs à leur place. (soit dit en passant, std::vector est également à préférer à des tableaux alloués dynamiquement).
Salutations, Ivan -- http://ivan.vecerina.com/contact/?subject=NG_POST <- e-mail contact form Brainbench MVP for C++ <> http://www.brainbench.com
"Mathieu Peyréga" <peyrega@netcourrier.nospam.com> wrote in message
news:408AA03B.3020700@netcourrier.nospam.com...
je me pose pas mal de questions au sujet des destructeurs virtuels, de
l'opérateur delete []...
...
Par exemple, le code suivant donne des resultats différents entre intel
8.0 vc 6.0 sp6 et MingW gcc 3.3.3.
...
struct B : public A
...
B* tabB = ::new B[2];
::delete [] tabB;
Code valide: doit appeler le destructeur B::~B() pour
les deux instances allouées.
Tableaux d'objets et sous-classes ne font pas bon ménage.
Après la conversion implicite dans:
A* tabA = ::new B[2];
tout accès à tabA[1] conduirait à un comportement indéfini,
car B et A peuvent ne pas avoir la même taille en mémoire.
Donc delete[] ne peut pas fonctionner, et tout résultat
est possible.
La solution? : il faut éviter les tableaux d'éléments
polymorphiques, et utiliser des tableaux de pointeurs
à leur place.
(soit dit en passant, std::vector est également à préférer
à des tableaux alloués dynamiquement).
Salutations,
Ivan
--
http://ivan.vecerina.com/contact/?subject=NG_POST <- e-mail contact form
Brainbench MVP for C++ <> http://www.brainbench.com
Tableaux d'objets et sous-classes ne font pas bon ménage. Après la conversion implicite dans: A* tabA = ::new B[2]; tout accès à tabA[1] conduirait à un comportement indéfini, car B et A peuvent ne pas avoir la même taille en mémoire. Donc delete[] ne peut pas fonctionner, et tout résultat est possible.
La solution? : il faut éviter les tableaux d'éléments polymorphiques, et utiliser des tableaux de pointeurs à leur place. (soit dit en passant, std::vector est également à préférer à des tableaux alloués dynamiquement).
Salutations, Ivan -- http://ivan.vecerina.com/contact/?subject=NG_POST <- e-mail contact form Brainbench MVP for C++ <> http://www.brainbench.com