我们知道,在C++中没有像Java那样的自动回收垃圾机制,,系统只会清理栈上由系统管理的资源,在类中若有对堆资源的申请,不进行手动释放资源就会导致内存泄漏问题,在学习了类和类模板之后,我们发现在类中有析构函数来进行资源释放功能,并且析构函数还支持加入程序员自身的操作,那么将指针托管给对象来实现可以做到程序员手动申请资源,让系统自动回收资源的效果,Boost库就提供了这样的智能指针来实现C++的自动回收机制,引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露,二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。
auto_ptr
auto_ptr在C++11已被摒弃,但在实际项目中仍可使用,若想实现auto_ptr的操作,最好还是使用unique_ptr,因为unique_ptr比auto_ptr更加安全,在介绍unique_ptr时会详细介绍。
伪代码如下:
template<typename T>
class SmartPtr
{
public:
SmartPtr(T* ptr) :mptr(ptr){}
~SmartPtr()
{
delete mptr;
mptr = NULL;
}
SmartPtr(const SmartPtr<T>& rhs)
{
mptr = rhs.mptr;
rhs.Release();
}
SmartPtr<T>& operator=(const SmartPtr<T>& rhs)
{
if (this != &rhs)
{
delete mptr;
mptr = rhs.mptr;
rhs.Release();
}
return *this;
}
T& operator*()
{
return *mptr;
}
T* operator->()
{
return mptr;
}
private:
void Release()const // const SmartPtr<T>* const this
{
(T*)mptr = NULL;
}
T* mptr;
};
int main()
{
SmartPtr<int> sp1 = new int;
SmartPtr<int> sp2 = sp1;//sp1.mptr = NULL;
*sp1 = 10;//error,因为此时sp1.mptr = NULL;,无法再被赋值
return 0;
}
反映到图中如下:
当申请一个auto指针后,auto会将堆资源托管到auto对象中,auto不会共享堆资源,只要进行拷贝构造或者是赋值操作时就会对当前auto对象进行Release()操作,将原本的使用权