为什么在使用gcc 4.7.2和MSVC-11.0进行编译时,以下代码会给出不同的输出?
#include <iostream>
class Base
{
public:
Base()
{
std::cout << "Base::Base() \n";
}
~Base()
{
std::cout << "Base::~Base() \n";
}
};
class Derived : public Base
{
public:
Derived()
{
std::cout << "Derived::Derived() \n";
}
~Derived()
{
std::cout << "Derived::~Derived() \n";
}
};
void foo(Base) {}
int main()
{
Derived instance;
foo(instance);
}
gcc 4.7.2
基::基地()
派生::派生()
基地::〜基地()
派生::〜衍生()
基地::〜基地()
MSVC-11.0
基::基地()
派生::派生()
基地::〜基地()
基地::〜基地()
为什么MSVC-11.0不会打印第二个Derived::~Derived()
?
答案 0 :(得分:1)
我正在使用MS Visual Studio 11.0.60315.01,cl版本17.0.60315.1。
将其用作main
int _tmain()
{
Derived instance;
foo(instance);
return 0;
}
并在return 0
行上设置一个断点,我得到了这个输出:
Base::Base()
Derived::Derived()
Base::~Base()
Base::~Base()
这是问题中报道的那个。
退出main
并进入crt会产生此输出:
Base::Base()
Derived::Derived()
Base::~Base()
Base::~Base()
Derived::~Derived()
Base::~Base()
将其添加到Base
类:
Base( const Base& b )
{
std::cout << "Base::Base( const Base& b ) \n";
}
导致此输出位于return 0;
Base::Base()
Derived::Derived()
Base::Base( const Base& b )
Base::~Base()
并执行所有析构函数后的输出:
Base::Base()
Derived::Derived()
Base::Base( const Base& b )
Base::~Base()
Derived::~Derived()
Base::~Base()
添加虚拟析构函数不会导致任何更改(如预期的那样):
Base::Base()
Derived::Derived()
Base::Base( const Base& b )
Base::~Base()
Derived::~Derived()
Base::~Base()
我的猜测是海报错误地记录了MSVC的输出。
编辑:
完整输出(没有复制构造函数)包含3个Base
析构函数。添加复制构造函数会将其减少为2 Base
个析构函数。
没有复制构造函数的行为等同于:
的输出void foo(Base) {}
int _tmain()
{
{
Derived instance;
Base b(instance);
foo(b);
}
return 0;
}