对具有动态分配内存和析构函数的 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
可以正确处理复制和移动。
假设我有三个 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
可以正确处理复制和移动。