失败的构造和破坏之间的 C++ 代码重用

标签 c++

我有一个包装一些非托管资源的类。它们根据 RAII 模式在构造函数中分配并在析构函数中释放。然而,分配不是原子的,如果构造函数的后期阶段失败,则有必要在向调用者抛出异常之前释放早期阶段分配的所有资源。

越来越多的情况下,这种边缘情况代码开始类似于析构函数本身。

我知道 C++ 类能够调用它自己的析构函数,因为析构函数的实现是为了处理移动操作留下的僵尸状态的实例,析构函数已经检查资源是否在之前实际分配试图释放他们。那么,类在构造失败的情况下调用其析构函数是否可以接受?

另一种方法是创建一个命名方法,称为 release()uninitialise() 或类似的东西,并在构造失败的情况下调用该方法,并将其作为主要方法析构函数的主体。

哪种模式更好?

最佳答案

比您的任何一个建议更好的模式是对每个成员对象也使用 RAII,而不仅仅是复合对象。

坚持单一职责原则。一个对象应该只管理单个对象或单个数组的内存。

像您这样的复合对象应该只有这些处理自己内存的 RAII 对象作为成员。如果一个成员的构造成功而另一个成员抛出异常,那么将调用第一个成员的析构函数并释放它自己的内存。

标准库中有 std::unique_ptr 用于这种类型的所有权。

关于失败的构造和破坏之间的 C++ 代码重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33739305/

相关文章:

c++ - iphone 上的 pragma pack(push)

c++ - 应用于基类列表的覆盖函数

c++ - OpenCV 从 Mat 访问元素

c++ - cmake 和 GenerateExportHeader

c++ - 如何在 visual studio 2012 中命名 openmp 中的关键部分

c++ - 为什么微软的strcpy支持重叠复制,会带来潜在的泄露风险?

C++ 制作特定大小的文件

c++ - 如何在 UML 中描述以 "void*"作为输入的成员函数?

c++ - 我的插入方法和binsearch方法有问题吗?

c++ - 函数错误中的数组字符串