开发环境: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测试),然后查看生成了以下哪种符号后,

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。

如果有人可以给我以上的答复,我将不胜感激。

最佳答案

首先,这些功能的目的在Itanium C++ ABI中进行了描述;请参见“基础对象析构函数”,“完整对象析构函数”和“删除析构函数”下的定义。 5.1.4中给出了到整齐的名称的映射。

基本上:

  • D2是“基础对象析构函数”。它破坏对象本身,以及数据成员和非虚拟基类。
  • D1是“完整对象析构函数”。此外,它还会破坏虚拟基类。
  • D0是“删除对象析构函数”。它完成了完整的对象析构函数所做的所有事情,并且调用了operator delete以实际释放内存。

  • 如果没有虚拟基类,则D2和D1相同;在足够的优化级别上,GCC实际上会将两个符号的别名别名为相同的代码。

    10-04 12:43