c++ - GNU GCC (g++) : Why does it generate multiple dtors?

标签 c++ g++ destructor

开发环境: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。

如果有人能就上述问题给我答复,我将不胜感激。

最佳答案

首先,Itanium C++ ABI 中描述了这些函数的用途。 ;请参阅“基础对象析构函数”、“完整对象析构函数”和“删除析构函数”下的定义。 5.1.4 中给出了到重整名称的映射。

基本上:

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

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

关于c++ - GNU GCC (g++) : Why does it generate multiple dtors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6613870/

相关文章:

c++ - 演绎指南和可变参数模板

c++ - 析构函数和 noexcept

c++ - 默认析构函数做了多少

c# - C++ dll 抛出断言失败

c++ - 单例析构函数没有被调用?

c++ - 哪个是链表的更有效实现?

c++ - 从 C++ 生成 C 代码

c++ - 为什么 __builtin_popcount 比我自己的位计数函数慢?

c++ - 编译并运行CGAL Triangulation演示

c++ - 如何为类 union 类编写析构函数