Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 术语-资源获取的含义是初始化_C++_Oop_Terminology_Raii - Fatal编程技术网

C++ 术语-资源获取的含义是初始化

C++ 术语-资源获取的含义是初始化,c++,oop,terminology,raii,C++,Oop,Terminology,Raii,我知道雷伊是干什么的。当/如果代码引发异常时,这都是关于防止内存泄漏等的 现在,我想理解这个聪明术语的含义。 获得意味着获得某物 那么,当我们说资源获取就是初始化时,这是什么意思呢 我只是在这里谈论这个术语的含义,而不是一般的概念。以前有人说过(可能是斯科特·迈尔斯,我不记得了),RAII应该被称为“破坏就是资源释放”,或者类似的词 “资源获取即初始化”的字面意思是,当一个对象被构造(初始化)时,它获取一些资源(例如内存分配或锁)。换句话说,它说您应该只通过初始化某个对象(其析构函数将释放该对

我知道雷伊是干什么的。当/如果代码引发异常时,这都是关于防止内存泄漏等的

现在,我想理解这个聪明术语的含义。

获得意味着获得某物

那么,当我们说资源获取就是初始化时,这是什么意思呢 我只是在这里谈论这个术语的含义,而不是一般的概念。

以前有人说过(可能是斯科特·迈尔斯,我不记得了),RAII应该被称为“破坏就是资源释放”,或者类似的词

“资源获取即初始化”的字面意思是,当一个对象被构造(初始化)时,它获取一些资源(例如内存分配或锁)。换句话说,它说您应该只通过初始化某个对象(其析构函数将释放该对象)来获取资源

强调这一点很重要,因为它与C编码风格不同,您可以通过特定API提供的任何方式获取资源(例如
malloc()
accept()
,或
pthread\u mutex\u lock()
),并通过显式调用相应的函数(例如
free()来释放它们)
close()
pthread\u mutex\u unlock()
)。C++中存在异常,使得这种方法相当不可行。即使在C语言中,它也会产生一些单调乏味的代码,每次使用API都必须写出这些代码,并且每个用户都必须确保在使用完资源后,控件始终通过这些代码

但该模式的重要部分是,当对象被销毁时,它会释放该资源。实际上,您是通过初始化对象来获取资源,还是在对象初始化后对其执行其他操作来获取资源并不重要。而且,当存在除初始化以外的操作生成由RAII对象管理的资源时,人们仍然将对象称为“RAII对象”


因此,不要太担心“RAII”中的“采集即初始化”,因为它有点误导性。

采集是一个通用术语,但它总是指分配一些资源的操作,例如文件句柄、数据库连接、互斥锁等特别是您的代码,它“拥有”它,因此必须在不需要时发布它以避免资源泄漏


RAII的一个重要概念是,资源生命周期与所有者对象的生命周期相关联,因为获取与初始化(=对象的创建)以及释放与销毁(保证)相一致。

在此网站上进行搜索。大量信息。@Anomail已经完成了。他们解释了这个概念,而不是这个“术语”的含义,这可能与许多关于这个问题的问题重复。另一个-@Laurent,这个答案没有得到任何投票。问题是
int*p=malloc(1000)
也是(整数)对象的初始化,但它不是我们在RAII上下文中所指的那种初始化。@Fred:的确如此
int*
不是RAII类型,因为它不进行清理。所以这不是RAII的意思,即使它是RAII字面上说的。