Просьба рассмотреть следующий фрагментарный код.Неожиданный вызов деструктора в C++
#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+
, это было бы понятно, поскольку деструкторы вызываются, когда элемент управления выходит из области действия объекта.
копия копия копия копия копия копия копия копия копия –
Попытки вывода 'this' (вместо или в дополнении к' x') в '~ A'. –
Кроме того, вы не должны возвращать указатель из 'operator +'. Сейчас это утечка. –