请考虑以下片段代码。
#include<iostream>
using namespace std;
class A
{
private:
int *x;
public:
A(int a)
{
cout<<"creating "<<a<<" "<<this<<endl;
x = new int;
*x = a;
}
A(A *a)
{
this->x = a->x;
}
~A()
{
cout<<"destroying "<<x<<endl;
delete x;
}
A *operator+(A a)
{
return new A(*x + *(a.x));
}
void display()
{
cout<<*x<<endl;
}
};
int main()
{
A a(5);
A b(10);
A c = a + b;
cout<<"control returns to main"<<endl;
a.display();
b.display();
c.display();
return 0;
}
它产生以下输出。
creating 5 0xbffd6710
creating 10 0xbffd6714
creating 15 0x9273028
destroying 0x9273018
control returns to main
5
0
15
destroying 0x9273038
destroying 0x9273018
destroying 0x9273008
我不明白为什么在控件返回主函数之前调用了析构函数。更重要的是为什么要在
b
上调用它?如果在operator+
返回的新对象上调用它,则可以理解,因为控件超出对象范围时将调用析构函数。 最佳答案
A *operator+(A a)
{
按价值收取。这意味着什么时候
a + b;
遇到创建
b
的新副本并将其传递给operator+(A a)
您没有看到一个新的构造函数,因为您没有实现复制构造函数,并且编译器为您创建了它。否则,您将看到另一个正在创建的A。
如果改为使用
operator*
作为参考 A *operator+(A& a)
{
return new A(*x + *(a.x));
}
您将不会再看到破坏,因为未创建任何副本。
关于c++ - 在C++中意外调用析构函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15990844/