開発環境:GNU GCC(g ++)4.1.2
ユニットテストで「コードカバレッジ-特に関数カバレッジ」を増やす方法を調査しようとしているときに、クラスdtorの一部が複数回生成されているように見えることがわかりました。何人かあなたはその理由について何か考えていますか?
次のコードを使用して、上記のことを試して観察しました。
「test.h」
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
「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;
}
上記のコード(g ++ test.cpp -o test)をビルドして、次のように生成されたシンボルの種類を確認したところ、
nm --demangleテスト
次の出力が表示されました。
==== 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()
私の質問は次のとおりです。
1)なぜ複数のdtorが生成されたのですか(BaseClass-2、DerivedClass-3)?
2)これらのdtorの違いは何ですか?これらの複数のdtorはどのように選択的に使用されますか?
C ++プロジェクトの関数カバレッジを100%にするには、ユニットテストでこれらすべてのdtorを呼び出すことができるように、これを理解する必要があると感じています。
上記について回答を頂ければ幸いです。