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。
赞 (0)