1、智能指针:使用C++模板技术实现的一个类
2、内存泄漏
(1)动态申请堆空间,用完后不归还
(2)C++语言中没有垃圾回收的机制
(3)指针无法控制所指堆空间的生命周期(本质的问题):指针也是一种变量,既然是变量就有生命周期,一个局部的指针指向堆空间之后,当局部指针声明周期结束了,这片堆空间的生命周期并没结束,指针指向的堆空间无人接管,发生内存泄漏。
3、智能指针
(1)指针生命周期结束时主动释放堆空间
(2)一片堆空间最多只能由一个指针标识
(3)杜绝指针运算和指针比较
4、智能指针设计方案
(1)通过类模板描述指针的行为:能够定义不同类型的指针对象
(2)重载指针特征操作符(->和*):利用对象模拟原生指针的行为
使用析构函数,主动释放指针所指向的堆空间
智能指针的使用军规!!!
智能指针只能用于指向堆空间中的内存。智能指针只能指向堆空间中的单个对象或者变量,不能指向堆空间的一个数组,也不能指向一个局部的变量或者局部对象。
示例代码:
#ifndef _SMARTPOINTER_H_
#define _SMARTPOINTER_H_
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;
}
};
}
#endif