通过价值和不同的行为

时间:2013-05-31 15:48:42

标签: c++

为什么在使用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()

https://ideone.com/NF9FQf

1 个答案:

答案 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;
}