C++栈对象超出作用域自动销毁,而堆对象需要手动new创建和delete来清理,为了防止忘记释放内存可以使用智能指针。
智能指针有三种,unique_ptr、shared_ptr 和 weak_ptr。
unique_ptr跟普通指针生命周期一样,超出作用域即释放,unique_ptr指针不能被复制,如:
unique_ptr<int> p(new int( ));
这是正常的unique_ptr定义语句,不过出于异常安全,最好使用以下写法:
unique_ptr<int> p = make_unique<int>( );
复制p:unique_ptr<int>p1 = p; 这样的话p和p1都指向一块内存,当p或p1其中之一超出作用域被释放以后,另一个就变成了野指针。不过实际上编译器一般也不会让你能复制unique_ptr指针。
shared_ptr可以被复制,它存在一个计数器,每复制一个shared_ptr,计数器就会+1,当计数器为0时释放这个指针占用的内存。
wake_ptr,shared_ptr可以复制到wake_ptr,这么做不会增加shared_ptr的计数,当shared_ptr计数器为0时wake_ptr也会被释放。
智能指针并不能完全取代new和delete。在使用智能指针时优先使用unique_ptr,因为shared_ptr消耗要多些。