智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来)。
一、auto_ptr:
这是一个被c++11标准废弃的一个智能指针,unique_ptr可以看做是替代品。
二、shared_ptr:
shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,删除所指向的堆内存。shared_ptr内部的引用计数是安全的,但是对象的读取需要加锁;一旦将一个new表达式返回指针交给shared_ptr管理后,就不要再通过普通内存访问这块内存;可以通过reset方法重置指向另一个对象,此时原对象引用计数减一;
三、unique_ptr:
unique_ptr对于所指向的对象,正如其名字所示,是 独占 的。所以,不可以对unique_ptr进行拷贝、赋值等操作,但是可以通过release函数在unique_ptr之间转移控制权;unique_ptr可以作为函数的返回值和参数使用,这时虽然也有隐含的拷贝存在,但是并非不可行的。
四、weak_ptr:
通常和shared_ptr搭配使用,通过lock()函数获取shared_ptr指针;可以指向shared_ptr对象,但是不增加引用计数;
参考链接:
C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr):
shared_ptr:
stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结: