知方号

知方号

一文详解C++11的三种智能指针

一文详解C++11的三种智能指针

一文详解C++11的三种智能指针 一、三种智能指针的关系概述二、unique_ptr三、shared_ptr四、weak_ptr

一、三种智能指针的关系概述

在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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。