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

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

假设我有三个 classes:

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){}
};

我应该在 class C 中明确定义一个析构函数吗?它会是什么样子?

Should I define explicitly a destructor in class C?

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

您永远不应该使用拥有引用,因此 C 没有理由拥有析构函数,否则必须对其进行彻底更改。

你也不应该使用拥有裸指针,所以 class B 也应该改变。最简单的解决方案是将其替换为 std::vector.

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

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