智能指针是实现自主的内存回收机制, C++中动态开辟内存需要程序员手动开辟、手动释放。然而有可能会出现程序员忘了释放,产生内存泄漏。引入智能指针就可以有效的避免这个问题,我们都知道栈上的空间是由系统开辟系统释放,而堆上的空间是由程序员手动开辟手动释放,智能指针结合堆栈开辟空间的特点,实现由程序员手动开辟,系统自动释放的内存回收机制。
智能指针就是让栈上的对象指向堆上的内存空间,当程序结束时,栈上的对象调用析构函数,释放空间时可以把指向堆上的空间一起释放。
常见的智能指针有
C++98:auto_ptr
C++11:unique_ptr、share_ptr、weak_ptr
auto_ptr
auto_ptr<int>ap2 = ap1; //取消ap1对内存块的控制
特点:所有权唯一
旧智能指针对象赋给新智能指针对象,取消旧智能指针的所有权 。
缺点:所有权转移导致旧智能指针提前失效
template<typename T>
class Auto_Ptr
{
public:
Auto_Ptr(T* ptr)
:mptr(ptr)
{}
Auto_Ptr(Auto_Ptr<T>& rhs)
{
mptr = rhs.Release();
}
Auto_Ptr<T>& operator=(Auto_Ptr<T>& rhs)
{
if (this != &rhs)
{
delete mptr;
mptr = rhs.Release();
}
return *this;
}
~Auto_Ptr()
{
delete mptr;
mptr = NULL;
}
T& operator*()
{
return *mptr;
}
T* operator->()
{
return mptr;
}
private:
T* Release()
{
T* ptmp = mptr;
mptr = NULL;
return ptmp;
}
T* mptr;
};
int main()
{
//int* p = new int;
std::auto_ptr<int> ap1(new int);
std::auto_ptr<int> ap2 = ap1;
*ap1 = 20;
//int* p = new int;
//int* q = p;
return 0;
}
unique_ptr:
特点:所有权唯一
禁止拷贝和移地,一个智能指针指向一个堆内存
template<typename T>
class Unique_Ptr
{
public:
Unique_Ptr(T* ptr)
:mptr(ptr)
{}
Unique_Ptr()
{
delete mptr;
mptr = NULL;
}
T& operator*()
{
return *mptr;
}
T* operator->()
{
return mptr;
}
private:
Unique_Ptr(Unique_Ptr<T>&);
Unique_Ptr<T>& operator=(Unique_Ptr<T>&);
T* mptr;
};
int main()
{
int* p = new int;
Unique_Ptr<int> up1(p);
Unique_Ptr<int> up2(p);
Unique_Ptr<int> up3(p);
return 0;
}