【C++】share_ptr详解

一、share_ptr 的简单使用

1.1、基本用法

从较浅的层面看,智能指针是利用了一种叫做RAII(资源获取即初始化)的技术对普通的指针进行封装,这使得智能指针实质是一个对象,行为表现的却像一个指针。

智能指针的作用是防止忘记调用delete释放内存和程序异常的进入catch块忘记释放内存。另外指针的释放时机也是非常有考究的,多次释放同一个指针会造成程序崩溃,这些都可以通过智能指针来解决。

智能指针的行为类似于一个常规指针,与常规指针之间重要的区别就是它负责自动释放所管理的资源,share_ptr 使用引用计数,允许多个 share_ptr 指向同一资源,每多一个 share_ptr 指向该资源,share_ptr 的引用计数就 +1 ,减为0时表示没有 share_ptr 对该资源进行引用了,就会释放所指向的资源。share_ptr 内部中的引用计数是线程安全的,但是引用的资源不是线程安全的。

1.2、初始化 

  1. 裸指针直接初始化,但不能通过隐式转换来构造,因为 share_ptr 构造函数被声明为 explicit
  2. 允许移动构造与拷贝构造
  3. 通过 make_share 构造
#include <iostream>
#include <memory>

class test {};

int main()
{
  std::shared_ptr<test> f(new test());              // 裸指针直接初始化
  //std::shared_ptr<test> f1 = new test();            // Error,explicit禁止隐式初始化
  std::shared_ptr<test> f2(f);                       // 拷贝构造函数
  std::shared_ptr<test> f3 = f;                      // 拷贝构造函数
  f2 = f;                                             // copy赋值运算符重载
  std::cout << f3.use_count() << " " << f3.unique() << std::endl;

  std::shared_ptr<test> f4(std::move(new test()));        // 移动构造函数
  //std::shared_ptr<test> f5 = std::move(new test());       // Error,explicit禁止隐式初始化
  std::shared_ptr<test> f6(std::move(f4));                 // 移动构造函数
  std::shared_ptr<test> f7 = std::move(f6);                // 移动构造函数
  std::cout << f7.use_count() << " " << f7.unique() << std::endl;

  std::shared_ptr<test[]> f8(new test[10]());             // Error,管理动态数组时,需要指定删除器
  std::shared_ptr<test> f9(new test[10](), std::default_delete<test[]>());

  auto f10 = std::make_shared<test>();               // std::make_shared来创建

  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芒果甜汤圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值