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

时间:2018-02-10 10:17:07

标签: c++ raii

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

shared_ptr<A> pA(new pA());

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

  

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

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

1 个答案:

答案 0 :(得分:5)

来自cppreference:

  

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

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

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

恕我直言,围绕RAII变体的许多讨论都是通过过于准确地解释该术语的含义而认为的。 RAII旨在表示对象生命周期管理的概念。