C++11 shared_ptr概念及用法

基本概念

  • shared_ptr 是C++11提供的一种智能指针类,主要用于消除内存泄漏和悬空指针的问题,方便资源的管理,自动释放没有指针引用的资源.
  • shared_ptr的大小是原始指针的两倍,因为它的内部有一个原始指针指向资源,同时有个指针指向引用计数.

所在库

C++11模板库

#include <memory>
shared_ptr<T> ptr(new T);  // T 可以是 int、char、类等各种类型

GNU G++ 的标准库中还没有支持,需使用boost

#include <boost/shared_ptr.hpp>

内存

每个 shared_ptr 对象在内部指向两个内存位置

  • 指向对象的指针
  • 用于控制引用计数数据的指针

计数变化规则

  • 当新的 shared_ptr 对象与指针关联时,则在其构造函数中,将与此指针关联的引用计数增加1。
  • 当任何 shared_ptr 对象超出作用域时,则在其析构函数中,它将关联指针的引用计数减1。如果引用计数变为0,则表示没有其他 shared_ptr 对象与此内存关联,在这种情况下,它使用delete函数删除该内存
  • 引用计数加一/减一操作是原子性的,所以线程安全的
    使用以下方法可检查 shared_ptr 对象的引用计数
ptr.use_count(); 

构造方法

(1)使用空参数构造函数构造

std::shared_ptr<T> ptr;

这样构造的话,ptr 的意义就相当于一个 NULL 指针。当试图在一个空指针上做类似于 *ptr 或者 ptr->xx 之类的东西的时候,会出现异常错误
(2)直接从 new 操作符的返回值构造

std::shared_ptr<T> ptr(new T()); //引用计数加 1

(3) 使用make_shared方法

std::shared_ptr<T> p1=std::make_shared<T> (); //引用计数加 1

(4)复制构造函数

std::shared_ptr<T> ptr2(ptr1);    // 这就是使用复制构造函数的方法,引用计数加 1

shared_ptr 可以当作函数的参数传递,或者当作函数的返回值返回,这个时候其实也相当于使用复制构造函数。
过程如下:作函数实参时,将指针执行复制构造函数传入函数体内,因此该内存块的引用计数+1;
当作为函数返回值时,复制构造函数将内存地址传递给新指针,引用计数+1,然后,局部指针执行析构,引用计数-1。

参考链接

智能指针之共享指针shared_ptr 的理解、使用(全)
C++11 std::shared_ptr总结与使用

原文链接: https://www.cnblogs.com/Daniel-Hu/p/14025717.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++11 shared_ptr概念及用法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/205331

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午10:12
下一篇 2023年2月12日 下午10:12

相关推荐