개발 환경 : 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-파괴 테스트
다음 출력을 볼 수 있습니다.
==== 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를 호출 할 수 있다는 느낌이 들었습니다.
누군가가 위의 답장을 줄 수 있다면 대단히 감사하겠습니다.