【问题标题】:C++ destructor behaviour [duplicate]C ++析构函数行为[重复]
【发布时间】:2012-04-01 10:04:03
【问题描述】:

我在 Visual Studio 2010 上尝试了以下程序。

#include <iostream>
using namespace std;

class A {
public:
        int p;

        /*A(){
            cout << "Constructor A" << endl;
        }*/

        ~A(){
            cout << "Destructor in A" << endl;
        }
};

class D: public A
{
public: 

        /*D(){
            cout << "Constructor D" << endl;
        }*/

        ~D(){
            cout << "Destructor in D" << endl;
        }
};

int main()
{
    D d =  D();
    cout << "Exiting main" << endl;
}

我得到的输出是 -

Destructor in D
Destructor in A
Exiting main
Destructor in D
Destructor in A

我无法理解为什么要调用 D 类和 A 类的析构函数 在“Exiting main”语句执行之前?

我尝试了另一件事-我在上面的代码中取消了对 D 类构造函数的注释,然后输出与我一样 预期 -

Constructor D
Exiting main
Destructor in D
Destructor in A

我在这里错过了什么?

【问题讨论】:

    标签: c++ destructor


    【解决方案1】:

    线

    D d =  D();
    

    首先创建一个临时的、未命名的对象,然后将其复制到d。您看到的是语句结束时被销毁的临时对象。命名对象dmain() 完成后超出范围时将被销毁。

    如果您将复制构造函数添加到 D,您将看到它被调用。

    在注释掉构造函数时,我认为您会看到预期的行为,因为编译器可以进行一些优化。

    【讨论】:

    • 没有解释为什么第二个例子不再打印析构函数调用了。
    • 你可以告诉它应该如何(:
    • 编译器只允许进行不可观察的优化。即使它确实复制省略,调用仍应被打印。
    • 嗯,即使使用O0,gcc 仍然不会创建临时对象...有趣
    • @Xeo C++ 标准规定编译器在几乎所有情况下都可以省略复制构造函数,即使复制构造函数有副作用。
    猜你喜欢
    • 2016-11-26
    • 2016-08-14
    • 2018-10-30
    • 1970-01-01
    • 2014-01-19
    • 2017-02-13
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多