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更容易。
- 通常提供更易于使用、更难滥用、封装性更强的接口。
在 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更容易。- 通常提供更易于使用、更难滥用、封装性更强的接口。