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