C++中的内存泄漏
- 动态申请堆空间,用完后不归还
- C++语言中没有垃圾回收机制
- 指针无法控制所指堆空间的生命周期
- -
智能指针
智能指针的概念:
智能指针是一个特殊的指针
智能指针生命周期结束时主动释放空间
一片堆空间只能由一个指针标识
智能指针的实现:
重载指针特征操作符( -> 和 * )
只能通过类的成员函数重载
重载函数不能使用参数(只能定义一个重载函数)
#include<iostream>
using namespace std;
template < typename T >
class SmartPointer
{
private:
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)
{
delete m_pointer;
m_pointer = obj.m_pointer;
const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
}
T* operator -> ()
{
return m_pointer;
}
T operator * ()
{
return *m_pointer;
}
T* get()
{
return m_pointer;
}
~SmartPointer()
{
delete m_pointer;
}
};
class Test
{
public:
Test()
{
cout << "Test()" << endl;
}
~Test()
{
cout << "~Test()" << endl;
}
};
int main()
{
SmartPointer<Test> p = new Test();
cout << "p = " << p.get() << endl;
SmartPointer<Test> p1 = p;
cout << "p = " << p.get() << endl;
cout << "p1 = " << p1.get() << endl;
return 0;
}
运行结果
Test()
p = 0x2710f0
p = 0
p1 = 0x2710f0
~Test()
智能指针的意义:
- 最大程度的避免内存问题
智能指针的使用军规:
- 智能指针只能用来指向堆空间中的对象或者变量