我知道 RAII 是做什么的。当/如果代码抛出异常时,这一切都是为了防止内存泄漏等。
现在,我想了解这个智能术语的含义。 http://en.wikipedia.org/wiki/Acquisition
获得意味着获得某些东西。
那么,当我们说资源获取是初始化时,这是什么意思呢?
我只是在这里谈论这个术语的含义,而不是一般的概念。
我知道 RAII 是做什么的。当/如果代码抛出异常时,这一切都是为了防止内存泄漏等。
现在,我想了解这个智能术语的含义。 http://en.wikipedia.org/wiki/Acquisition
获得意味着获得某些东西。
那么,当我们说资源获取是初始化时,这是什么意思呢?
我只是在这里谈论这个术语的含义,而不是一般的概念。
之前已经说过(可能是 Scott Meyers,我不记得了),RAII 应该被称为“破坏是资源释放”,或者类似的词。
“资源获取就是初始化”字面意思是当一个对象被构造(初始化)时,它会获取一些资源(比如内存分配或者锁)。换句话说,它说你应该只通过初始化某个析构函数将释放它的对象来获取资源。
强调这一点很重要,因为它背离了 C 编码风格,在这种风格中,您可以通过特定 API 提供的任何方式(例如 、 或 )获取资源malloc()
,accept()
并pthread_mutex_lock()
通过显式调用相应的函数(例如free()
、close()
、pthread_mutex_unlock()
)来释放它们。C++ 中异常的存在使得这种方法相当不可行。即使在 C 语言中,它也会导致一些乏味的代码,每次使用 API 都必须写出,并且每个用户都必须确保控制权在他们使用完资源后始终通过该代码。
但是该模式的重要部分是,当对象被销毁时,它会释放该资源。实际上,您是通过初始化对象来获取资源,还是在对象初始化后对其进行其他操作来获取资源并不重要。当存在生成由 RAII 对象管理的资源的初始化以外的操作时,人们仍然会将对象称为“RAII 对象”。
所以,不要太担心“RAII”中的“采集即初始化”,因为无论如何它有点误导。
获取是一个通用术语,但它总是指分配一些资源的操作——例如文件句柄、数据库连接、互斥体……——特别是你的代码,它“拥有”它,因此必须释放当不需要避免资源泄漏时。
RAII 的重要概念是资源生命周期与所有者对象的生命周期绑定,因为获取与初始化(=对象的创建)以及释放与销毁(这是有保证的)同时发生。