gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:15:45 24 4
gpt4 key购买 nike

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

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

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

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

哪种模式更好?

最佳答案

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

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com