c++ - 资源获取是初始化 "RAII"

标签 c++ raii

在下面的例子中

class X
{
    int *r;
public: 
    X() {
        cout << "X is created";
        r = new int[10];
    };
    ~X() {
        cout<< "X is destroyed";
        delete [] r;
    };
};
class Y
{
public: 
    Y() {
        X x;
        throw 44;
    }; 
    ~Y() {
        cout << "Y is destroyed";
    };
};

我从一个网站得到了这个 RAII 的例子,我有一些疑问。请帮忙。

  1. 在 x 的构造函数中,我们没有考虑“如果内存分配失败”的场景。
  2. 这里 Y 的析构函数是安全的,因为在 y 中,构造函数没有分配任何内存。如果我们还需要在 y 构造函数中进行一些内存分配怎么办?

最佳答案

X 的构造函数中, 如果 new失败它会抛出一个异常(std::bad_alloc)。这意味着构造函数永远不会完成,因此对象的生命周期永远不会开始,因此它的析构函数永远不会被调用(没有对象)并且 new[] 之间没有不匹配。和 delete[] . (X 应该有一个用户声明的复制构造函数和一个用户声明的复制赋值运算符,因为如果构造成功并且对象被复制或赋值,提供的实现将破坏此保证。)

Y ,如果它在它的构造函数中分配内存并且此分配成功,那么它需要确保在构造的其余部分在任何时候抛出异常时释放此内存,并且如果构造函数完成,则在析构函数中释放内存(假设内存设计为持续对象的生命周期长度)。

为了使这更容易,任何分配的内存都应该立即交给一个对象,该对象的唯一职责是释放内存。让一个类管理指向多个已分配内存块的原始指针是复杂且容易出错的管理代码的秘诀。

关于c++ - 资源获取是初始化 "RAII",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484012/

相关文章:

c++ - 使用 clang : AST differences in when including a header in another source file or parsing it directly 解析命名空间

c++ - RAII 资源处理

C++ std::string 在任何平台上都是 100% RAII?

c++ - boost asio 套接字是否有适当的 RAII 清理

c++ - AES-gcm 加密的 IV 中是否存在不起作用的值?

c++ - 结构化绑定(bind)在 C++17 中不起作用

c++ - 在类构造函数 C++ 中初始化结构数组

c++ - 给定一个指向容器的指针,我如何向它添加一个项目?

singleton - 如何让 Rust 单例的析构函数运行?

C++ RAII 和多态兼容性