为了账号安全,请及时绑定邮箱和手机立即绑定

什么是资源获取是初始化(Raii)?

什么是资源获取是初始化(Raii)?

C++ C
忽然笑 2019-05-30 17:27:10
什么是资源获取是初始化(Raii)?什么是资源获取是初始化(Raii)?
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

对于一个非常强大的概念来说,这是一个非常糟糕的名字,也可能是C+开发人员在切换到其他语言时忽略的第一件事情之一。有一些运动试图将这个概念重新命名为范围资源管理虽然它似乎还没有流行起来。

当我们说“资源”时,我们不仅仅是指内存-它可以是文件句柄、网络套接字、数据库句柄、GDI对象.总之,我们有限的供应,所以我们需要能够控制它们的使用。“范围绑定”方面意味着对象的生存期绑定到变量的作用域,因此当变量超出作用域时,析构函数将释放资源。它的一个非常有用的特性是,它提供了更大的例外安全性。例如,比较一下:

RawResourceHandle* handle=createNewResource();handle->performInvalidOperation();  // Oops, throws exception...deleteResource(handle); 
// oh dear, never gets called so the resource leaks

和Raii一号

class ManagedResourceHandle {public:
   ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {};
   ~ManagedResourceHandle() {delete rawHandle; }
   ... // omitted operator*, etcprivate:
   RawResourceHandle* rawHandle;};ManagedResourceHandle handle(createNewResource());handle->performInvalidOperation();

在后一种情况下,当抛出异常并解除堆栈时,将销毁局部变量,这将确保我们的资源被清理,不会泄漏。


查看完整回答
反对 回复 2019-05-30
?
PIPIONE

TA贡献1829条经验 获得超9个赞

这是一个编程成语,意思是

  • 将资源封装到类中(其构造函数通常(但不一定是*)获取资源,其析构函数总是释放资源)
  • 通过类的本地实例使用资源*
  • 当对象超出作用域时,资源将自动释放。

这保证了无论在使用资源时发生什么,它最终都会被释放(无论是由于正常返回、销毁包含的对象或引发的异常)。

它是C+中广泛使用的良好实践,因为除了是处理资源的一种安全方法之外,它还使代码更加简洁,因为您不需要将错误处理代码与主要功能混合使用。

* 最新情况:“局部变量”可能指类的局部变量或非静态成员变量。在后一种情况下,成员变量将使用其所有者对象进行初始化和销毁。

** UPDATE 2:正如@SBI指出的那样,尽管资源通常是在构造函数内分配的,但也可以在外部分配,并作为参数传入。


查看完整回答
反对 回复 2019-05-30
?
12345678_0001

TA贡献1802条经验 获得超5个赞

“Raii”是“资源获取是初始化”的意思,实际上是个用词不当的词,因为它不是资源采办(以及对象的初始化)它与之相关,但是释放资源(通过毁灭(指物体)。
但Raii是我们得到的名字,而且很棒。

这个成语的核心功能是将资源(内存块、打开的文件、未锁定的互斥体、您命名的it)封装在局部的、自动的对象,并让该对象的析构函数在对象所属范围的末尾销毁该对象时释放该资源:

{
  raii obj(acquire_resource());
  // ...} // obj's dtor will call release_resource()

当然,对象并不总是本地的、自动的对象。他们也可以是一个阶级的成员:

class something {private:
  raii obj_;  // will live and die with instances of the class
  // ... };

如果这样的对象管理内存,它们通常被称为“智能指针”。

这方面有很多不同的地方。例如,在第一个代码片段中,出现了一个问题:如果有人想要复制,会发生什么?obj。最简单的解决办法就是简单地不允许复制。std::unique_ptr<>在下一个C+标准中作为标准库的一部分的智能指针就是这样做的。
另一个这样的智能指针,std::shared_ptr它所拥有的资源(动态分配的对象)的“共享所有权”特性。也就是说,它可以自由复制,所有副本都引用同一个对象。智能指针跟踪引用同一个对象的副本的数量,并在最后一个对象被销毁时删除它。
第三个变体的特点是std::auto_ptr它实现了一种移动语义:一个对象只有一个指针,试图复制一个对象将导致(通过语法黑客)将对象的所有权传递给复制操作的目标。


查看完整回答
反对 回复 2019-05-30
  • 3 回答
  • 0 关注
  • 854 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信