以下代码调用析构函数4次:
#include<iostream>
using namespace std;
class A{
public:
A(){cout<<"A"<<endl;}
~A(){cout<<"~A"<<endl;}
A f(){cout<<"F"<<endl; A b; return b;}
};
int main(){
A a,b;
b=a.f();
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
A
A
F
A
~A
~A
~A
~A
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?我原以为应该只有三个析构函数调用.
有两个对象main(),因此析构函数将因为它们而被调用两次.一个对象f(),因此析构函数将被调用一次.共3次(您期望,但继续阅读......)
现在第四次为从返回时创建的临时对象调用析构函数f.只有在根本没有RVO时才会发生这种情况.RVO是编译器的选择,这意味着它可以优化它,或者它可能不会.该语言不保证RVO.
无论如何,只需提高您的优化水平; 我相信你最多只会看到3个析构函数的调用.
你的编译器没有优化它。您是否在启用优化的情况下编译了它?
以下是使用 gcc 编译的相同代码的输出:
A
A
F
A
~A
~A
~A
Run Code Online (Sandbox Code Playgroud)