Środowisko programistyczne: GNU GCC (g ++) 4.1.2
Podczas gdy próbuję zbadać, jak zwiększyć `` pokrycie kodu - szczególnie pokrycie funkcji '' w testach jednostkowych, odkryłem, że niektóre klasy dtor wydają się być generowane wiele razy. Czy ktoś z was ma pojęcie, dlaczego, proszę?
Wypróbowałem i zaobserwowałem to, o czym wspomniałem powyżej, używając następującego kodu.
W „test.h”
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
W „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;
}
Kiedy zbudowałem powyższy kod (g ++ test.cpp -o test), a następnie zobaczyłem, jakie symbole zostały wygenerowane w następujący sposób,
nm --demangle test
Widziałem następujący wynik.
==== 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()
Moje pytania są następujące.
1) Dlaczego wygenerowano wielu lekarzy (BaseClass - 2, DerivedClass - 3)?
2) Jaka jest różnica między tymi lekarzami? Jak tych wielu lekarzy będzie selektywnie wykorzystywanych?
Mam teraz wrażenie, że aby osiągnąć 100% pokrycie funkcji projektu C ++, musielibyśmy to zrozumieć, aby móc wywołać wszystkich tych lekarzy w moich testach jednostkowych.
Byłbym bardzo wdzięczny, gdyby ktoś mógł udzielić mi odpowiedzi na powyższe.