智能指针是RAII的一个好习惯吗?

big*_*iao 2 c++ raii

首先,这里讨论RAII和智能指针.
我一直认为Smart Pointer就像shared_ptr是RAII的一个好习惯,因为它在构造函数中获取堆内存资源

shared_ptr<A> pA(new pA());
Run Code Online (Sandbox Code Playgroud)

并且可以通过引用计数及其析构函数在适当的时间释放内存.
但是,今天早上我的同事告诉我:

" 智能指针不是我认为的RAII.在STL中唯一可以严格称为RAII的是std::lock_guard,其他只不过是RRID."

所以我弄错了什么?或者我的同事所说的实际上是没有意义的?

Snp*_*nps 5

从cppreference:

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

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

术语RRID(资源释放是毁灭)很少见,它的含义似乎有些含糊不清.大多数情况下,它与RAII具有相同的含义.

恕我直言,许多关于RAII变体的讨论都是从过于准确地解释该术语的含义而得到认可的.RAII旨在表示对象生命周期管理的概念.