当对象超出范围时,为什么不调用析构函数

时间:2014-07-21 17:49:25

标签: c++ constructor destructor compiler-optimization raii

使用g++ -O0 a.cpp -std=c++98编译的程序C ++:

class A
{
public:
        A(const A& a)  { cout << "A copy" << endl; }
        A() { cout << "A" << endl; }
        ~A() {cout << "~A" << endl; }
};

A f()
{
        cout << "f1" << endl;
        A a1;
        cout << "f2" << endl;
        return a1;
}

int main()
{
        cout << "m1" << endl;
        A a2 = f();
        cout << "m2" << endl;
}

产生输出:

m1
f1
A
f2
m2
~A

困扰我的是,在f2之后,不会调用析构函数和复制构造函数。根据我的理解,a1超出了范围,必须调用它的析构函数。看起来该对象从本地a1移动到a2而不进行复制。我知道有返回值优化,但它是优化和优化不能改变代码的逻辑,并且缺少输出说~A和A副本。

0 个答案:

没有答案