@智能指针
内存泄漏(臭名昭著的Bug)
一、动态申请堆空间,用完后不归还;
二、C++语言中没有垃圾回收的机制;
三、指针无法控制所指堆空间的生命周期。
当代的C++软件平台中的智能指针(需求)
一、指针生命周期结束时主动释放堆空间;
二、一片堆空间最多只能由一个指针标识;
三、杜绝指针运算和指针比较。
智能指针的设计方案
1、通过类模板描述指针的行为;
1)、能够定义不同类型的指针对象;
2、重载指针特征操作符(->和*)
2)、利用对象模拟原生指针的行为;
例题:智能指针的实现
#ifndef SMARTPOINTER_H
#define SMARTPOINTER_H
#include "object.h"
namespace DTLib
{
template <typename T>
class SmartPointer : public Object
{
protected:
T* m_pointer;
public:
SmartPointer(T* p = nullptr)
{
m_pointer = p;
}
//拷贝构造函数
SmartPointer(const SmartPointer<T>& obj)
{
m_pointer = obj.m_pointer;
//置为空
const_cast<SmartPointer<T>&>(obj).m_pointer = nullptr;
}
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 = nullptr;
}
return *this;
}
T* operator->()
{
return m_pointer;
}
T& operator*()
{
return *m_pointer; //这个成员指针所指向的内容
}
bool isNull()
{
return (m_pointer == nullptr); //当前的指针是否为空
}
T* get()
{
return m_pointer;
}
~SmartPointer()
{
delete m_pointer;
m_pointer = nullptr; //置为空 主动的释放这个成员指针m_pointer所指向的堆空间
}
};
}
#endif // SMARTPOINTER_H
main .c中要包含上面实现的SmartPointer这个头文件
#include <iostream>
#include "SmartPointer.h"
using namespace std;
using namespace DTLib;
class Test
{
public:
Test()
{
cout << "Test()" << endl;
}
~Test()
{
cout << "~Test()" << endl;
}
};
int main()
{
SmartPointer<Test> sp = new Test();
SmartPointer<Test> nsp;
nsp = sp;
cout << sp.isNull() << endl;
cout << nsp.isNull() << endl;
return 0;
}
注意:智能指针的军规
只能用来指向堆空间中的单个对象或者变量,不能用来指向堆空间中一个数组、局部的对象、局部的变量。
小结
1、指针特征操作符(->和*)可以被重载;
2、重载指针特征符能够使用对象代替指针;
3、智能指针只能用于指向堆空间中的内存;
4、智能指针的意义在于最大程度的避免内存的问题。