对具有动态分配的内存和析构函数的类对象的引用
A reference to the object of the class with dynamically allocated memory and destructor
假设我有三个类:
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
可以正确处理副本和移动。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- C++析构函数调用两次,堆栈分配的复合对象
- 如何从 Gtk::窗口调用派生对象的析构函数
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 为什么为未删除的对象调用析构函数?
- 对象的构造函数和析构函数
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 从未调用shared_ptr对象的析构函数
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 使用私有析构函数删除动态分配的对象
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- C++ - 析构函数只是释放内存还是实际删除对象
- 受保护的析构函数禁用在堆栈上创建派生类的对象?
- 当 T 具有非平凡析构函数时,类类型 T 的对象是否可以常量初始化?
- 编译器是否在由 new 初始化的对象上调用隐式析构函数
- 受保护析构函数对象在堆vs堆栈上的分配