使用new和delete来管理内存,容易出现问题,比如忘记delete、程序异常or过早返回导致没有运行delete之类的。智能指针的使用方式跟常规指针一样,最大的区别是它会自动释放所指向的对象。因为智能指针是一个类,当这个对象的生命周期结束时会执行析构函数,那么只要在析构函数中delete 指针就可以自动完成内存的回收。
主要有两个指针:shared_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指向的对象。
shared_ptr
创建智能指针(为空):
shared_ptr<string> p1; shared_ptr<list<int>> p2;shared_ptr和new结合使用:
shared_ptr<int> p2(new int(1024));//初始化shared_ptr的复制和赋值:当进行复制和赋值时,每个shared_ptr都会记录有多少个其他shared_ptr指向这个相同的对象。
auto p = make_shared<int>(42); //auto用于变量的自动类型推断。 auto q(p);每个shared_ptr都有一个引用计数器,复制一个shared_ptr时,计数器递增。给shared_ptr赋予一个新值或是shared_ptr被销毁(例如一个局部的shared_ptr离开其作用域)时,计数器递减。一旦最后一个shared_ptr需要被销毁,而且计数器变为0时,它就会调用shared_ptr类的析构函数销毁对象,并释放它所指向的内存空间。
unique_ptr
unique_ptr大致跟shared_ptr相同,不同的是某个时刻只能有一个unique_ptr指向一个给定对象。
智能指针原本还有一个auto_ptr,但是缺陷很多,已经被unique_ptr取代。
weak_ptr
weak_ptr主要用来解决share_ptr的循环引用问题,参考智能指针与循环引用。
class B; // 前置声明 class A { public: shared_ptr<B> ptr; }; class B { public: shared_ptr<A> ptr; }; int main() { while(true) { shared_ptr<A> pa(new A()); shared_ptr<B> pb(new B()); pa -> ptr = pb; pb -> ptr = pa; } return 0; }将一个 weak_ptr 绑定到一个 shared_ptr,不会改变 shared_ptr 的引用计数。即使有 weak_ptr 指向对象,一旦最后一个指向对象的 shared_ptr 被销毁,对象就会被释放。因此weak_ptr不能直接访问对象,要先调用lock函数判断对象是否仍然存在,如果存在,会返回一个指向共享对象的 shared_ptr,然后再用这个share_ptr访问对象。
if ( shared_ptr<int> np = wp.lock() ) // 如果 np 不为空则条件成立 { // 在if中,np与p共享对象 }参考[C++11新特性] 智能指针详解