Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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/6/haskell/9.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++ 智能指针是RAII的良好实践吗?_C++_Raii - Fatal编程技术网

C++ 智能指针是RAII的良好实践吗?

C++ 智能指针是RAII的良好实践吗?,c++,raii,C++,Raii,首先,这里讨论一下。 我一直认为像shared\u ptr这样的智能指针是RAII的一个很好的实践,因为它像构造函数一样获得堆内存资源 shared_ptr<A> pA(new pA()); shared_ptr pA(新pA()); 并且可以通过引用计数及其析构函数在正确的时间释放内存。 然而,今天早上我的同事告诉我: “智能指针不是我所认为的RAII。在STL中唯一可以严格称为RAII的是std::lock\u guard,其他的都是RRID” 那我是不是做错了什么?或者我的

首先,这里讨论一下。
我一直认为像
shared\u ptr
这样的智能指针是RAII的一个很好的实践,因为它像构造函数一样获得堆内存资源

shared_ptr<A> pA(new pA());
shared_ptr pA(新pA());
并且可以通过引用计数及其析构函数在正确的时间释放内存。
然而,今天早上我的同事告诉我:

智能指针不是我所认为的RAII在STL中唯一可以严格称为RAII的是
std::lock\u guard
,其他的都是RRID

那我是不是做错了什么?或者我的同事说的话实际上毫无意义?

来自CPPFerence:

资源获取是初始化或RAII,是一种C++编程技术,它绑定了在使用之前必须获取的资源的生命周期(分配堆内存、执行线程、打开套接字、打开文件、锁定互斥体、磁盘空间、数据库连接在有限供应中存在的任何东西)到对象的生命周期。

std::shared_ptr
绝对是RAII,因为它获取资源并将其生命周期绑定到自己的生命周期,从而接管释放/破坏资源的责任。这是RAII的核心原则

术语RRID(资源释放即破坏)很少出现,其含义似乎有些模糊。大多数情况下,它与RAII具有相同的含义


我认为许多围绕RAII变体的讨论过于精确地解释了该术语的含义。RAII旨在表示对象生命周期管理的概念。

RRID到底是什么?@john Resource Release is Destructionshared\u ptr肯定是RAII,但当然,共享指针表示共享所有权。RRID只是标准术语RAID的一个更好的名称。使用这样的术语“STL”表明您的同事在定义上可能不太准确。@ErikAlapäa是真的吗?我听说RAID是RRID的超集。我试图在stackoverflow中找到RRID的一些内容,但很少有人讨论这一点。