【问题标题】:C++, should I call destructor?C++,我应该调用析构函数吗?
【发布时间】:2020-09-25 13:32:03
【问题描述】:

在 c++ 中,我有一个使用 new[] 分配内存的类,所以我编写了如下的析构函数:

Matrix::~Matrix() {
    delete[] data;
}

我的 Matrix 类包含名为 complex 的字段,它是我编写的 Complex 类的成员。

我的问题是,我是否也应该调用 complex 的析构函数,以及如何调用?

【问题讨论】:

  • 如果你在Complex类中定义了析构函数,当你的Matrix对象被销毁时,拥有的复杂对象的析构函数会被自动调用。
  • 请参阅标记为destruction sequence 的部分,了解有关如何销毁对象及其成员的详细信息。
  • “我应该调用complex 的析构函数too”——这有点误解。代码不会调用data 的析构函数。它删除 data。如果你new它你delete它。

标签: c++ class destructor


【解决方案1】:

外部类的析构函数不能调用内部数据成员的析构函数。

如果你编译并运行下面的代码,你会看到A的析构函数,即内部数据成员的类,虽然在B析构函数中没有被显式调用,但被调用了

#include <iostream>
struct A{
    ~A(){
        std::cout << "A des\n";
    }
};
struct B{
    A a;
    ~B(){
        std::cout << "B des\n";
    }
};
int main(){
    B b;
}

出局

B des
A des

【讨论】:

  • 小心“外”和“内”之类的词; Java 人认为它们具有相当特定的含义,但在 C++ 中它们只是普通的词,在这种情况下,几乎是杂音。对象具有数据成员。当一个对象被销毁时,它的析构函数会销毁它的成员。 +1。
【解决方案2】:

我的问题是,我是否也应该将析构函数称为 complex,以及如何调用?

不,您不必调用析构函数。这就是new/delete 的全部意义所在;他们调用构造函数/析构函数。


话虽如此,但考虑到您似乎是 C++ 新手,强烈建议使用 std::vector&lt;Complex&gt;std::unique_ptr&lt;Complex[]&gt; 而不是原始指针。一些原因是:

  • 泄漏/双重释放的可能性较小;所有权是显而易见的。
  • 如果您忘记添加复制构造函数,将不会执行错误的“浅”指针复制。
  • 您不必担心delete/delete[] 不匹配。
  • vector 可以更轻松地调整/复制大小。
  • 通常提供更易于使用、更难滥用、封装性更强的接口。

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 2016-09-24
    • 1970-01-01
    • 2016-03-26
    • 2011-10-15
    • 2011-04-28
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多