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 时,释放堆内存
- 通过计数机制(ref)标识堆空间
1.3.2 计数机制原理剖析
1.3.3 SharedPointer 类的声明
1.3.4 智能指针的比较
- 由于SharedPointer支持多个对象同时指向一片堆空间,因此必须支持
比较操作
1.3.5 使用军规
- 只能用来指向堆空间只能够的
单个变量
(对象) - 不同类型的智能指针对象
不能混合使用
不要
使用delete释放智能指针指向的堆空间
参考一 : 狄泰软件课程
如有侵权:请联系邮箱 1986005934@qq.com