打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
智能指针
Boost智能指针
c 智能指针及 循环引用问题
智能指针 std::auto_ptr 和 shared_ptr
C 智能指针如何实现智能?
C 智能指针详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服