c++中的auto_ptr所做的事情就是解决指针没有被释放而导致内存泄漏的问题。有了auto_ptr之后程序员就不用去操心当对象被销毁时释放资源的问题了。
裸指针存在的问题:
auto_ptr源码:
template <class _Ty>
class auto_ptr
{
private:
bool _Owns;//指针的拥有权
_Ty* _Ptr;
public:
auto_ptr(_Ty* p = 0) :_Owns(p != nullptr), _Ptr(p)
{
//构造函数
}
auto_ptr(const auto_ptr<_Ty>& _Y) :_Owns(_Y._Owns), _Ptr(_Y._Ptr)
{
//拷贝构造函数
}
auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y)//赋值运算符的重载函数
{
if (this != &_Y)
{
if (_Ptr != _Y._Ptr)
{
if (_Owns)
{
delete _Ptr;
}
_Owns = _Y._Owns;
else if (_Y._Owns)
{
_Ptr = _Y.release();//拥有权转移函数
//不用释放堆区的内存空间,只是将拥有权转移到另一个对象,被转移的指针置为nullptr
}
}
}
return *this;
}
~autp_ptr()//析构函数
{
if (_Owns)//如果有拥有权也就是有指针指向对象
{
delete _Ptr;//将指针所指的堆区空间释放
}
_Ptr = nullptr;//该指针置为nullptr
}
_Ty& operator*() const//*重载
{
return *get();//返回指针所指之物
}
_Ty* operator->() const//->重载
{
return get();//返回该指针所指对象的地址
}
_Ty* release() const//拥有权转移函数
{
((auto_ptr<_Ty>*)this)->_Owns = false;
return _Ptr;
}
};
auto_ptr在c++11中已经被弃用,由unique_ptr代替。
主要原因有以下几点:
- 拥有权转移后不方便再次访问
auto_ptr<string> ps1(new string("hello"));
auto_ptr<string> ps2(ps1);
执行完这个代码之后由于ps1的拥有权转移给了ps2,因此当再去访问ps1这个对象的成员时,就会找不到。
- 内存崩溃
int *p = new int (0);
auto_ptr<int> p1(p);
auto_ptr<int> p2(p);
本段程序中p1和p2都指向同一块堆区空间,当析构对象的时候同一块内存空间要被释放两次,这必然是不行的。
- auto_ptr不能被用在标准STL容器中。