Environnement de développement : GNU GCC (g++) 4.1.2
Alors que j'essaie d'étudier comment augmenter la "couverture du code - en particulier la couverture des fonctions" dans les tests unitaires, j'ai constaté que certains dtor de classe semblent être générés plusieurs fois. L'un d'entre vous a-t-il une idée de la raison, s'il vous plaît ?
J'ai essayé et observé ce que j'ai mentionné ci-dessus en utilisant le code suivant.
Dans "test.h"
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
Dans "test.cpp"
#include <iostream>
#include "test.h"
BaseClass::~BaseClass()
{
std::cout << "BaseClass dtor invoked" << std::endl;
}
void BaseClass::someMethod()
{
std::cout << "Base class method" << std::endl;
}
DerivedClass::~DerivedClass()
{
std::cout << "DerivedClass dtor invoked" << std::endl;
}
void DerivedClass::someMethod()
{
std::cout << "Derived class method" << std::endl;
}
int main()
{
BaseClass* b_ptr = new BaseClass;
b_ptr->someMethod();
delete b_ptr;
}
Lorsque j'ai construit le code ci-dessus (g++ test.cpp -o test) et que je vois ensuite quels types de symboles ont été générés comme suit,
nm --demangle test
J'ai pu voir la sortie suivante.
==== following is partial output ====
08048816 T DerivedClass::someMethod()
08048922 T DerivedClass::~DerivedClass()
080489aa T DerivedClass::~DerivedClass()
08048a32 T DerivedClass::~DerivedClass()
08048842 T BaseClass::someMethod()
0804886e T BaseClass::~BaseClass()
080488f6 T BaseClass::~BaseClass()
Mes questions sont les suivantes.
1) Pourquoi plusieurs dtors ont-ils été générés (BaseClass - 2, DerivedClass - 3) ?
2) Quelles sont les différences entre ces dtors ? Comment ces dtors multiples seront-ils utilisés de manière sélective ?
J'ai maintenant le sentiment que pour atteindre une couverture fonctionnelle de 100 % pour un projet C++, il faudrait que nous comprenions cela pour que je puisse invoquer tous ces dtors dans mes tests unitaires.
J'apprécierais grandement si quelqu'un pouvait me donner la réponse à ce qui précède.
6 votes
+1 pour avoir inclus un programme d'exemple minimal et complet. ( sscce.org )
2 votes
Votre classe de base a-t-elle intentionnellement un destructeur non virtuel ?
2 votes
Une petite observation ; vous avez péché, et n'avez pas rendu virtuel le destructeur de votre BaseClass.
0 votes
Désolé pour mon échantillon incomplet. Oui, la BaseClass devrait avoir un destructeur virtuel pour que ces objets de classe puissent être utilisés de manière polymorphe.
1 votes
@Lyke : Eh bien, si vous savez que vous n'allez pas supprimer un dérivé par le biais d'un pointeur vers la base, c'est OK, je voulais juste m'assurer... curieusement, si vous rendez les membres de la base virtuels, vous obtenez encore plus destructrices.
0 votes
Lorsque j'ai changé le destructeur de BaseClass en virtual, j'ai observé que BaseClass avait maintenant 3 destructeurs. Quelqu'un pourrait-il me dire pourquoi ?
0 votes
Il y a quelque temps, j'ai essayé de pénétrer dans ctor / dtor dans gdb et je n'ai pas réussi. Sur le site de gdb, ils ont indiqué que gcc génère différentes versions du code objet pour le même code source, afin de permettre la liaison avec différentes ABI C++. Je ne suis pas sûr des détails de la norme C++, mais voici un lien Internet. cygwin.com/ml/gdb/2004-07/msg00162.html .
0 votes
J'ai posé cette question sous une forme différente il y a quelques temps, et j'ai obtenu deux excellentes réponses avant que quelqu'un ne remarque qu'il s'agissait d'un doublon. Je colle un lien ici pour que les gens puissent trouver les autres réponses : stackoverflow.com/questions/44558119/