在C++11中出现三种智能指针,分别是unique_ptr、shared_ptr、weak_ptr。这三种智能指针分别有各自的应用场景,同时这些应用场景是有相互联系的。
总的来说:
1. unique_ptr的出现,在一定程度上解决了裸指针使用完没有及时释放导致的内存泄漏问题,但多个unique_ptr不能指向同一资源;
2. shared_ptr的出现,解决了unique_ptr不能指向同一资源的问题。它的特点是引用计数不为0,就坚决不释放资源。这又导致了另一个问题:交叉引用导致资源无法释放,又会内存泄漏;
3. weak_ptr的特点是引用对象时引用计数不增加,但自能成为资源的观察者,无法使用资源。如果要使用资源,必须升级为shared_ptr。weak_ptr解决了shared_ptr交叉引用的问题。
二、unique_ptr和名字一样,unique_ptr的特点就是“独占”的意思,多个unique_ptr无法指向同一对象。相比于裸指针,unique_ptr的最大优势当然是超出作用域时会自动释放资源。其实unique_ptr解决的并不只是资源自动释放的问题。在C++11之前还有auto_ptr、scope_ptr这两种类型的指针,unique_ptr在资源自动释放的同时也解决了两个指针的拷贝、赋值问题(指针的浅拷贝问题)。
假设有下面的代码:
#include #include int main() {std::auto_ptr p1(new int(100));std::auto_ptr p2(p1); // 拷贝构造std::cout addRef();return *this;}T& operator*() {return *_ptr;}T* operator->() {return _ptr;}// 返回引用计数int use_count() {return _pRefCnt->_count;}private:T* _ptr;RefCnt* _pRefCnt;};int main() {CSmartPtr p1(new int(100));std::cout