配套环境
vscode + g++
设计要求
(1).指针生命周期结束时主动释放堆空间
(2).一片堆空间最多只能由一个指针标识
(3).杜绝指针运算和指针比较
设计方案
(1).通过类模板描述指针的行为
能够定义不同类型的指针对象
(2).重载指针特征操作符(->和*)
利用对象模拟原生指针的行为
实现代码
#ifndef SMARTPOINTER_H
#define SMARTPOINTER_H
#include <iostream>
namespace DTLib {
template <typename T> class SmartPointer {
protected:
T *m_pointer;
public:
SmartPointer(T *p = NULL) { m_pointer = p; } // 默认构造函数
SmartPointer(const SmartPointer<T> &obj) { // 拷贝构造函数
m_pointer = obj.m_pointer;
const_cast<SmartPointer<T> &>(obj).m_pointer = NULL;
}
SmartPointer<T> &operator=(const SmartPointer<T> &obj) { // 赋值运算符重载
if (this != &obj) {
delete m_pointer;
m_pointer = obj.m_pointer;
const_cast<SmartPointer<T> &>(obj).m_pointer = NULL;
}
return *this;
}
T *operator->() { return m_pointer; } // ->操作符重载
T &operator*() { return *m_pointer; } // *操作符重载
bool isNull() { return (m_pointer == NULL); } // 判断当前指针是否为空
T *get() { return m_pointer; } // 获取当前指针
~SmartPointer() { delete m_pointer; } // 析构函数
};
} // namespace DTLib
#endif
使用要求
智能指针只能用来指向堆空间中的单个对象或者变量
小结
指针特征操作符(->和*)可以被重载
重载指针特征符能够使用对象代替指针
智能指针只能用于指向堆空间中的内存
智能指针的意义在于最大程度的避免内存问题
喝水不忘挖井人: 更多内容请搜索狄泰软件学院(淘宝/B站)