目录
智能指针是一种预防型的内存泄漏的解决方案。智能指针在C++没有垃圾回收器的环境下,可以很好的解决异常安全等带来的内存泄露问题。
RAII是一种利用对象生命周期来控制程序资源的简单技术。
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此没玩们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:
- 不需要显示的释放资源(例如锁)
- 对象所需的资源在其生命周期内始终保持有效。
智能指针的原理:
- RAII特性
- 重载operator*和operator->,具有指针一样的行为
C++98提供了auto_ptr的智能指针
auto_ptr的实现原理:管理权转移的思想
template<class T>
class AutoPtr
{
public:
AutoPtr(T* ptr = NULL)
:_ptr(ptr)
{}
~AutoPtr()
{
if(_ptr)
delete _ptr;
}
//一旦发生拷贝,就将ap中资源转移到当前对象中,然后令ap与其所管理资源断开联系
//这样就解决了一块空间被多个对象使用而造成程序奔溃问题
AutoPtr(AutoPtr<T>& ap)
:_ptr(ap._ptr)
{
ap._ptr = NULL;
}
AutoPtr<T>& operator=(AutoPtr<T>& ap)
{
if(this != &ap)//检测是否给自己赋值
{
//释放当前对象中的资源
if(_ptr)
delete _ptr;
//转移ap中的资源到当前对象中
_ptr = ap._ptr;
ap._ptr = NULL;
}
return *this;
}
T* operator*(){return *_ptr;}
T& operator->(){return _ptr;}
private:
T* _ptr;
};
auto_ptr缺点:拷贝后会把原来对象的指针赋空了,导致ap对象悬空,通过原来的对象访问资源时就会出现问题。
c++11提供更靠谱的unique_ptr
unique_ptr的实现原理:防拷贝
template<class T>
class UniquePtr
{
public:
UniquePtr(T * ptr = nullptr)
: _ptr(ptr)
{}
~UniquePtr()
{
if (_ptr)
delete _ptr;
}
T& operator*() { return *_ptr; }
T* operator->() { return _ptr; }
private:
// C++98防拷贝的方式:只声明不实现+声明成私有
//UniquePtr(UniquePtr<T> const &);
//UniquePtr & operator=(UniquePtr<T> const &);