【发布时间】:2011-09-30 15:05:45
【问题描述】:
开发环境: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。
如果有人能就上述问题给我答复,我将不胜感激。
【问题讨论】:
-
+1 包含一个最小的、完整的示例程序。 (sscce.org)
-
您的基类是否有意使用非虚拟析构函数?
-
一个小观察;你犯了罪,并没有让你的 BaseClass 析构函数成为虚拟的。
-
对不起,我的样本不完整。是的,BaseClass 应该有虚拟析构函数,所以这些类对象可以多态地使用。
-
@Lyke:好吧,如果你知道你不会通过指向基址的指针删除派生的,那没关系,我只是确保......有趣的是,如果你这样做基本成员是虚拟的,你会得到更多析构函数。
标签: c++ g++ destructor