【问题标题】:Confusing idiom name RAII令人困惑的成语名称 RAII
【发布时间】:2020-11-11 13:08:16
【问题描述】:

我想我理解 RAII 的含义,并且我在 SO 上发现了很多关于这个成语的问题。我更关心的是 RAII 名称本身。我找不到将这个成语的四个词与它所描述的概念相匹配的方法。有人问过 Bjarne 吗?

在我的理解中,RAII 的意思是:

  • 资源封装到一个类中。
    • 资源在其构造函数中获得
    • 然后在其析构函数中释放。
  • 当对象超出范围时,此包装类必须处理资源删除。

我如何向某人解释为什么 RAII 以这样的方式命名,而又不以这样一个强大的成语来说这不是一个好名字的借口?

【问题讨论】:

  • 为什么这是个问题?如果只是一个坏名字,没必要为此道歉太多,只要你能清楚地解释这个概念:)
  • 为了解释一个概念,我应该能够解释为什么它被这样命名。否则,这将是一个非常糟糕的解释。
  • 资源没有封装在一个类中,它由一个对象持有。对象被初始化,所以你有你的“初始化”。它与对象的生命周期有关。我不知道为什么这么多人认为“类”是 OOP 的定义特征。它不是。这是对象及其职责。
  • 正如您在wikipedia (RAII) 上看到的那样,该成语有您可能更喜欢或更好解释的替代名称。

标签: c++ raii


【解决方案1】:

在 RAII 类型中,构造函数获取需要管理的资源。所以,如果你这样做了

RAII_Type foo;

那么资源获取发生在初始化时,所以资源获取就是初始化。

【讨论】:

    【解决方案2】:

    这样想:每一次资源获取都必须是一个对象的初始化,让对象负责清理,而不是对象的初始化器。不允许未经初始化的资源获取。

    【讨论】:

      【解决方案3】:

      R资源 A收购 s 初始化

      如前所述,获取任何资源都涉及使用资源的描述符/句柄/标识符初始化对象。释放资源描述符/句柄/标识符(作为获取的强制大括号对)的适当位置是对象析构函数。一个设计良好的类具有即发即弃的对象实例;用户代码不必担心资源泄漏,因为拥有对象应该负责。

      干杯, 调频。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 2018-06-08
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多