[英]C++ unwanted destruction
有人可以解释为什么当c
完成构造时, b
的析构函数(c的成员)被调用,而d
被破坏 - 正如预期的那样 - 当c
的析构函数被调用时?
#include <iostream>
using namespace std;
class A
{
public:
int a, b;
};
class B
{
public:
A* array[10];
B()
{
for(int i = 0 ; i < 10 ; i++)
array[i] = new A();
}
~B()
{
for(int i = 0 ; i < 10 ; i++)
delete array[i];
}
};
class C
{
public:
B b;
B* d;
C()
{
b = B();
}
~C()
{
delete d;
}
};
int main()
{
B b = B();
C c = C();
cout << "Ashlamish" << endl;
system("pause");
return 0;
}
因为在C的构造函数中,您在行c = B();
中创建临时B对象c = B();
并且当赋值完成时,该临时对象正在被销毁。
在b = B()
您构建了一个新的B类临时实例,为b分配了一个副本,然后对该临时实例进行了解析。
我想你要声明这样的c:
C c;
这将构造一个名为c的对象,它将在范围出口处被破坏。 另一方面,你有什么;
C c = C();
将构造一个C类型的匿名对象,用它复制构造c并立即销毁匿名对象。 c仍将在范围的最后被破坏。
在C的构造函数中你有
b = B();
它的作用是:
要修复此问题,请在C的构造函数中使用初始化列表,如下所示:
C() : b()
{ }
或者只是将构造函数留空,这样它将使用默认构造函数。
线b = B();
在C
构造函数中实例化一个B
类型的新对象,并使用B
的复制构造函数在C::b
复制这样的对象。
当C
构造函数返回b
没有被销毁,但用于调用b
的复制构造函数的B
临时对象是。
您可以删除此类指令以避免实例化B
临时,在这种情况下,b将仅使用默认构造函数构造。
临时B的析构函数被称为( b = B();
),而不是成员b
。 这行可以被删除,因为b
已经在隐式初始化列表中默认构造
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.