对具有动态分配的内存和析构函数的类对象的引用

A reference to the object of the class with dynamically allocated memory and destructor

本文关键字:析构函数 对象 引用 内存 动态分配      更新时间:2023-10-16

假设我有三个类:

class A{
};
class B{
int S;
A* arr;
B(int s):S(s){
arr = new A[S];
}
~B(){
delete [] arr;    
}
};
class C{
B& b;
C(B& b): b(b){}
};

我应该在类 C 中显式定义析构函数吗?会是什么样子?

我应该在类 C 中显式定义析构函数吗?

要回答这个问题,你必须知道你的班级是做什么的。类的目的是管理分配的内存吗?那么,是的,您可能需要一个析构函数。目的是引用由其他东西管理的对象吗?那为什么需要一个析构函数呢?如果您不知道析构函数应该做什么,那么您通常不需要析构函数。

你永远不应该使用拥有引用,所以C应该没有什么理由使用析构函数,或者必须对其进行彻底更改。

您也不应该使用拥有裸指针,因此也应该更改类B。最简单的解决方案是将其替换为std::vector.

不,你不需要C的析构函数,但如果你想正确实现复制语义,你确实需要一个复制构造函数(以及移动构造函数、复制赋值运算符和移动赋值运算符(用于类B。就像现在一样,如果您要复制类B的对象,您必须指向同一数组的对象 - 当对象被破坏时,您将获得双重删除,从而导致未定义的行为。

无需使用原始指针。您可以简单地使用std::vector来处理元素的分配及其销毁。这也意味着您不需要实现任何其他类型的构造函数或析构函数B因为std::vector可以正确处理副本和移动。