产生原由:当你在堆中分配出一块内存,即使用new或者malloc出来的空间,也需要自己手动去调用delete或者free去析构这块空间,但是忘记析构的时候,会产生内存泄漏等问题,此时产生了智能指针来解决此类问题。
智能指针类型:auto_ptr,scoped_ptr,shared_ptr,weak_ptr
1.auto_ptr
属于STL库,包含在#include<memory>
头文件中,用来管理单个堆内存,简单使用但是有许多缺陷
实现auto_ptr
(1)权限转移
template<class T>
class My_autoptr
{
public:
My_autoptr(T*ptr=0)
:_ptr(ptr)
{
ptr = NULL;
}
My_autoptr(My_autoptr<T> & ap)
:_ptr(ap._ptr)
{
ap._ptr = NULL;
}
My_autoptr<T>& operator =(My_autoptr<T>& ap)
{
if (this != &ap)
{
if (_ptr)
{
delete _ptr;
}
_ptr = ap._ptr;
ap._ptr = NULL;
}
return *this;
}
~My_autoptr()
{
if (_ptr)
{
delete _ptr;
_ptr = NULL;
}
}
T &operator*()
{
return *_ptr;
}
T *operator->()
{
return _ptr;
}
private:
T *_ptr;
};
void test()
{
My_autoptr<int>p(new int(123));
My_autoptr<int>p1(p);
My_autoptr<int>p2;
p2 = p1;
}
如图所示:
(2)在AutoPtr的类内加入新的成员变量bool类型的_owner,构造函数中将_owner设置为true,表示对象是指针所指向内存的拥有者。
代码实现