C++,我应该调用析构函数吗?

C++, should I call destructor?

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

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

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

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

没有外部class的析构函数调用内部数据成员的析构函数。

如果你编译和 运行 下面的代码,你会看到 A 的析构函数,内部数据成员的 class 被调用,尽管它没有被调用在 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

my question is, should I call the destructor for complex too, and how?

不,您不必调用析构函数。这就是 new/delete 的重点;他们称 constructors/destructors.


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

  • 不太可能leak/double免费;所有权是显而易见的。
  • 如果您忘记添加复制构造函数,将不会执行错误的 "shallow" 指针复制。
  • 您不必担心 delete/delete[] 不匹配。
  • vector可以resized/copied更容易。
  • 通常提供更易于使用、更难滥用、封装性更强的接口。