数据结构(十 三)之 再论智能指针

1.1
1.1.1 思考

  • 使用智能指针(SmartPointer)替换单链表(LinkList)中的原生指针是否可行?

  • 直接抛出异常了,

1.1.2 问题出在了哪里

  • SmartPointer的设计方案
    • 指针生命周期结束时主动释放堆空间
    • 一片堆空间最多只能由一个指针标识
    • 杜绝指针运算和制造比较

1.1.3 新的设计方案
-创建新的智能指针
在这里插入图片描述

1.2 新的设计方案

1.2.1 新的设计方案

  • Pointer 是智能指针的抽象父类(模板)
    • 纯虚析构函数 virtual ~Pointer = 0;
    • 重载 operator->();
    • 重载 operator*();

1.2.2 设计方案

template <typename T>
class Pointer : public Object
{
protected:
	T * m_pointer;
public:
	Pointer(T* p = NULL);
	T* operator->();
	T& operator*();
	bool isNull();
	T* get();
	// 这里没有写virtual ~Pointer = 0; 因为Pointer类继承自Object类,只要不实现~Pointer,Pointer就是抽象类	
}

1.2.3 思考

  • 如何实现 SharedPointer,使得多个智能指针对象可以指向同一片堆内存,同时支持堆内存的自动释放

1.3 SharedPointer

1.3.1 SharedPointer 设计要点

  • 类模板
    • 通过计数机制(ref)标识堆空间
      • 堆空间被指向时:ref++
      • 指针被置空时: ref–;
      • ref == 0 时,释放堆内存

1.3.2 计数机制原理剖析

在这里插入图片描述
1.3.3 SharedPointer 类的声明

1.3.4 智能指针的比较

  • 由于SharedPointer支持多个对象同时指向一片堆空间,因此必须支持比较操作

1.3.5 使用军规

  • 只能用来指向堆空间只能够的单个变量(对象)
  • 不同类型的智能指针对象不能混合使用
  • 不要使用delete释放智能指针指向的堆空间

参考一 : 狄泰软件课程

如有侵权:请联系邮箱 1986005934@qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值