C++ std::shared_ptr

在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 在多个线程上的析构不需要外部加锁保护, 因为引用计数本身修改是原子操作.

如果觉得有帮助,可以扫描右边的微信打赏码支持一下.

Leave a Reply

Your email address will not be published. Required fields are marked *