C++ 笔记 - std::shared_ptr

1,179 阅读1分钟

在C++中shared_ptrstd::unique_ptr类似。std::shared_ptrstd::unique_ptr的主要区别在于前者是使用了引用计数,可以跟踪引用数目。这意味着,可以有多个std::shared_ptr实例指向同一块动态分配的内存,当最后一个引用对象离开其作用域时,才会释放这块内存。值得注意的是,std::shared_ptr不能用于管理C语言风格的动态数组。下面看一使用的例子:

#include <cassert>
#include <iostream>
#include <memory>

class Any {};

int main(void) {
    auto p1 = std::make_shared<Any>();
    assert(p1.use_count() == 1);
    {
        auto p2 = p1;
        std::shared_ptr<Any> p3;
        p3 = p1;
        assert(p1.use_count() == 3);
        assert(p2.use_count() == 3);
        assert(p3.use_count() == 3);
    }
    assert(p1.use_count() == 1);
    return 0;
}

  • shared_ptr智能指针只能通过赋值构造函数才能增加引用计数。如果同一指针分别赋值给shared_ptr会造成double free的错误。
  • 对同一个对象分享所有权的shared_ptr在多个线程上的析构不需要外部加锁保护,因为引用计数本身修改是原子操作。