C++智能指针简介

C++智能指针简介

一、简介

前言

  1. 从C到C++

    • C: mallocfree
    • C++: newdelete
  2. 从C++到Morden C++

    • C++: newdelete
    • morden C++: shared_ptr, unique_ptrweak_ptr

作用

​ 更安全的使用动态内存

使用方法

(1) 使用

  • 像普通指针一样使用。(重载了指针的两个操作符)

(2) 创建

  • 转化与构建

(3) 所有权管理

  • 通过 reset 方法重新指定
  • 通过移动语义转移所有权
  • 智能指针还可能没有对象,这种情况被称为empty

(4) 实例

int main()
{
    std::shared_ptr<string> pt1(new string("C++"));
    std::shared_ptr<string> pt2 = pt1;
    std::weak_ptr<string> pw = pt1;

    *pt1 = "Java";
    pt1.reset(); //取消pt1的引用
    pt2.reset(); //取消pt2的引用
    
    return 0;
}

二、智能指针详解

(1) shared_ptr

shared_ptr是 共享所有权的智能指针
实现原理

引用计数,它的具体做法如下:

(a)当创建智能指针类的新对象时,初始化指针,并将引用计数设置为1;

(b)当能智能指针类对象作为另一个对象的副本时,拷贝构造函数复制副本的指向辅助类对象的指针,并增加辅助类对象对基础类对象的引用计数(加1);

(c)使用赋值操作符对一个智能指针类对象进行赋值时,处理复杂一点:先使左操作数的引用计数减 1,如果减1后引用计数为 0,则释放指针所指对象内存。然后增加右操作数所指对象的引用计数;

(d)完成析构函数:调用析构函数时,析构函数先使引用计数减 1,如果减至 0 则 delete 对象。

代价:
  1. shared_ptr 对象除了包括一个所拥有对象的指针外,还必须包括一个引用计数代理对象的指针;
  2. 时间上的开销主要在初始化和拷贝操作上。
注意要点:
  1. 可复制可移动
  2. reset(): 重置之前检查指针管理权,重置指针。
  3. get(): 只暴露指针,不释放管理权。
  4. swap():交换所有权,引用计数不变。

(2) unique_ptr

unique_ptr 独占所有权的智能指针
注意要点:
  1. 不可可复制可移动
  2. reset(): 删除旧指针的内存,重置指针。
  3. get(): 只暴露指针,不释放管理权。
  4. swap():交换指针。
  5. release(): 释放管理权

(3) weak_ptr

weak_ptr 不具有所有权的智能指针
注意要点:
  1. 与裸指针一样,但是获取不到裸指针
  2. 使用时必须转化为shared_ptr,其函数为lock()
  3. shared_ptr 的辅助者,破除循环引用的内存泄露。

(4)拓展部分

1.尽量使用make_shared初始化

2.智能指针作为函数的参数和返回值

  • 智能指针对象
  • 智能指针指针
  • 智能指针引用

3.智能指针的转化

三、结语

(1)要点:

  • 智能指针不是指针,是对象
  • 智能指针意味着管理权
  • 理解智能指针的管理权限
(2)陷阱:
  • 不要把一个原生指针给多个智能指针管理
  • 记得使用release()的返回值
  • 禁止delete 智能指针get 函数返回的指针
(3)各种各样的智能指针:
  • Boost
  • Loki基于Policy的智能指针
  • Qt基于的父子对象和自身deleteLater的半自动智能指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值