GNU GCC (g ++ ): Почему он генерирует несколько dtors?

Среда разработки: 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 test

, я смог увидеть следующий результат.

==== 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) Почему было создано несколько dtors (BaseClass - 2, DerivedClass - 3)?

2) В чем разница между этими dtors? Как эти множественные dtors будут выборочно использоваться?

Теперь у меня есть ощущение, что для достижения 100% покрытия функций для проекта C ++ нам нужно это понять, чтобы я мог вызывать все эти dtors в своих модульных тестах.

Я был бы очень признателен, если бы кто-нибудь мог дать мне ответ на вышеизложенное.

84
задан razlebe 7 July 2011 в 16:29
поделиться