繁体   English   中英

C ++不需要的破坏

[英]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();

它的作用是:

  • 构造B类临时对象
  • 通过使用默认赋值运算符将此对象分配给b
  • 销毁临时对象

要修复此问题,请在C的构造函数中使用初始化列表,如下所示:

    C() : b()
    { }

或者只是将构造函数留空,这样它将使用默认构造函数。

线b = B(); C构造函数中实例化一个B类型的新对象,并使用B的复制构造函数在C::b复制这样的对象。

C构造函数返回b没有被销毁,但用于调用b的复制构造函数的B临时对象是。

您可以删除此类指令以避免实例化B临时,在这种情况下,b将仅使用默认构造函数构造。

临时B的析构函数被称为( b = B(); ),而不是成员b 这行可以被删除,因为b已经在隐式初始化列表中默认构造

你在这里犯了一个主要的罪 - 不遵守3规则

你的B需要一个析构函数,但不实现复制和赋值。

然后,您可以通过实际执行赋值来复合错误。

您还可以继续删除未初始化的指针。 (如果d为NULL,那就没关系,但没有理由说它应该是)。

您还需要实现复制构造,尤其是您的编译器可能会选择将其用于上述构造,尽管它可能实际上不会这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM