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总结与使用


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM