【C++11智能指针新特性大揭秘】:std::unique_ptr vs std::shared_ptr

发布时间: 2024-12-09 18:59:16 阅读量: 9 订阅数: 11
DOC

C++ unique_ptr weak_ptr shared_ptr auto_ptr智能指针.doc

star5星 · 资源好评率100%
![【C++11智能指针新特性大揭秘】:std::unique_ptr vs std::shared_ptr](https://img-blog.csdnimg.cn/f865d92b7a754764adcfb8774817e760.png) # 1. C++11智能指针概述 C++11引入的智能指针是对传统裸指针的一次重大改进。这些智能指针通过引用计数(`std::shared_ptr`)或唯一所有权(`std::unique_ptr`)机制,自动管理内存资源,减少了内存泄漏和悬空指针的风险。`std::weak_ptr`则是配合`std::shared_ptr`使用的辅助智能指针,它不控制对象的生命周期,但可以检查`std::shared_ptr`实例是否还存在。 ## 1.1 智能指针的诞生背景 在C++98/03标准中,手动管理资源和内存是常态,开发者经常需要编写大量的`new`和`delete`代码,这导致了资源管理上的许多问题,例如忘记释放资源、重复释放以及由此引发的内存泄漏和悬挂指针等问题。C++11中引入的智能指针解决了这些问题,它们是资源获取即初始化(RAII)概念的直接应用。 ## 1.2 智能指针的主要类型 智能指针主要分为三类: - `std::unique_ptr`:它保证同一时间只有一个所有者对指针进行管理,当该智能指针被销毁时,所管理的对象也会被销毁。 - `std::shared_ptr`:它允许多个所有者共享同一资源,只有当最后一个`std::shared_ptr`被销毁时,所管理的对象才会被销毁。 - `std::weak_ptr`:它是一种特殊类型的智能指针,用于解决`std::shared_ptr`可能产生的循环引用问题。 智能指针的使用改变了C++资源管理的方式,使代码更加安全和健壮。接下来的章节我们将深入探讨`std::unique_ptr`和`std::shared_ptr`的细节。 # 2. std::unique_ptr的深入剖析 ### 2.1 std::unique_ptr的基本概念 #### 2.1.1 std::unique_ptr的定义和初始化 `std::unique_ptr` 是 C++11 引入的一种智能指针类型,用来在单个对象生命周期结束时自动释放其所指向的资源。作为智能指针的一员,`std::unique_ptr` 体现了 RAII(Resource Acquisition Is Initialization)原则,通过构造函数获取资源,通过析构函数自动释放资源,从而保证资源的正确管理。 其定义和初始化可以通过以下几种方式实现: ```cpp std::unique_ptr<int> p1(new int(10)); // 使用new操作符动态创建对象 std::unique_ptr<int> p2 = std::make_unique<int>(20); // C++14起推荐使用make_unique进行初始化 std::unique_ptr<int[]> p3(new int[10]); // 初始化数组 std::unique_ptr<int> p4; // 默认初始化 ``` #### 2.1.2 std::unique_ptr的所有权机制 `std::unique_ptr` 保证在其生命周期内,它所指向的对象只有一个所有权。当 `std::unique_ptr` 被销毁或重新赋值时,原先指向的对象会被自动释放。这确保了不会有内存泄漏或其他资源管理问题。 所有权转移机制通常采用移动语义实现,下面的代码展示了如何转移所有权: ```cpp std::unique_ptr<int> p1(new int(10)); std::unique_ptr<int> p2 = std::move(p1); // p1放弃所有权,p2接管 // 此时p1不再拥有任何对象,p2拥有new创建的int对象 ``` ### 2.2 std::unique_ptr的实践应用 #### 2.2.1 std::unique_ptr在资源管理中的作用 在现代 C++ 编程中,`std::unique_ptr` 常用于封装那些拥有生命周期的资源,如动态分配的内存、文件句柄、互斥锁等。它保证了即使在发生异常的情况下资源也能被正确释放。使用 `std::unique_ptr` 进行资源管理的示例如下: ```cpp void processResource() { std::unique_ptr<Resource> resource = std::make_unique<Resource>(); // ... 进行资源处理操作 } // 函数结束时,resource被销毁,资源随之释放 ``` #### 2.2.2 std::unique_ptr与自定义删除器 `std::unique_ptr` 允许提供自定义删除器以处理特定资源的释放逻辑。例如,如果资源的释放不是通过 `delete` 完成的,可以提供一个合适的函数或者函数对象作为删除器: ```cpp void customDelete(Resource* r) { // 自定义释放资源的逻辑 } std::unique_ptr<Resource, void(*)(Resource*)> resourcePtr(new Resource(), customDelete); ``` ### 2.3 std::unique_ptr的优势与局限性 #### 2.3.1 std::unique_ptr的性能优势 `std::unique_ptr` 由于其实现相对简单,相比于 `std::shared_ptr`,它在空间和时间上的开销都相对较小。因为它不需要维护引用计数,所以内存占用更小,也没有更新引用计数的额外开销。 ```cpp std::unique_ptr<Resource> ptr1(new Resource()); // ptr1的大小为指针大小 + 删除器大小(通常是指针大小) ``` #### 2.3.2 std::unique_ptr的使用限制 `std::unique_ptr` 的限制主要在于它不能被复制(因为复制操作会导致所有权不明确的问题),只能通过移动语义转移所有权。此外,由于它的独占特性,`std::unique_ptr` 不能直接用于需要共享所有权的场景。 ```cpp std::unique_ptr<Resource> p1(new Resource()); // std::unique_ptr<Resource> p2(p1); // 编译错误:std::unique_ptr不支持复制构造 std::unique_ptr<Resource> p2 = std::move(p1); // 正确:通过移动语义转移所有权 ``` ## 第二章小结 在本章节中,我们深入了解了 `std::unique_ptr` 的基本概念、实践应用以及它的优势与局限性。我们介绍了 `std::unique_ptr` 如何通过定义和初始化以及所有权机制来确保资源的自动释放。在实践应用方面,我们探讨了它在资源管理中的作用以及如何与自定义删除器结合使用。最后,我们分析了其性能优势并讨论了使用限制,包括它不支持复制构造的特性,这使得它在需要共享所有权的场景中受到限制。通过这些讨论,我们展示了 `std::unique_ptr` 作为一种高效且安全的资源管理方式,在现代 C++ 编程中的重要性。 # 3. std::shared_ptr的深入剖析 ## 3.1 std::shared_ptr的基本概念 ### 3.1.1 std::shared_ptr的定义和初始化 `std::shared_ptr` 是 C++11 引入的共享所有权智能指针,它允许多个指针共享对同一对象的所有权。这通过引用计数机制实现,当最后一个拥有对象的 `shared_ptr` 被销毁时,对象会自动被删除。下面展示了如何定义和初始化一个 `shared_ptr`: ```cpp #include <memory> #include <iostream> int main() { // 创建一个指向int的shared_ptr std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // 通过拷贝构造函数创建另一个shared_ptr std::shared_ptr<int> ptr2 = ptr1; // 创建一个指向数组的shared_ptr std::shared_ptr<int[]> ptr3 = std::make_shared<int[]>(5); return 0; } ``` 在初始化 `std::shared_ptr` 时,推荐使用 `std::make_shared` 工厂函数,它比直接使用 `new` 关键字和 `std::shared_ptr` 构造函数更高
corwn 最低0.47元/天 解锁专栏
买1年送1年
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

SW_孙维

开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
专栏简介
本专栏深入探讨了 C++ 智能指针的使用和管理,涵盖了从基本原理到高级技术的广泛内容。从 RAII 原理到最佳实践,专栏提供了 20 个技巧,帮助读者全面掌握智能指针。它还比较了智能指针与手动内存管理,突出了性能和安全方面的优势。专栏深入分析了 std::shared_ptr 的引用计数机制,并提供了 std::weak_ptr 的实用指南,以解锁资源管理的最佳实践。此外,它还讨论了 C++11 中智能指针的新特性,并提供了定制释放策略的进阶用法。通过性能大比拼和嵌入式系统中的智能指针分析,专栏为读者提供了在关键路径上做出明智选择所需的知识,并探讨了智能指针与 Boost 智能指针之间的差异。
最低0.47元/天 解锁专栏
买1年送1年
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

【dSPACE RTI 环境搭建全攻略】:开发新手必备的环境配置教程

![【dSPACE RTI 环境搭建全攻略】:开发新手必备的环境配置教程](https://www.ecedha.org/portals/47/ECE Media/Product Guide/dspace2.png?ver=2020-05-17-161416-553) 参考资源链接:[DSpace RTI CAN Multi Message开发配置教程](https://wenku.csdn.net/doc/33wfcned3q?spm=1055.2635.3001.10343) # 1. dSPACE RTI环境概述 dSPACE Real-Time Interface (RTI) 是一

【Dev C++编译错误快速定位】:Id returned 1 exit status问题的诊断与解决

![【Dev C++编译错误快速定位】:Id returned 1 exit status问题的诊断与解决](https://cdn.programiz.com/sites/tutorial2program/files/cpp-function-parameters.png) 参考资源链接:[解决Dev C++编译错误:Id returned 1 exit status](https://wenku.csdn.net/doc/6412b470be7fbd1778d3f976?spm=1055.2635.3001.10343) # 1. Dev C++编译错误概览 ## 理解编译过程 在软

【SAP财务处理:移动与评估类型协调全攻略】:财务与物流的完美结合

![SAP 移动类型与评估类型详解](https://d11wkw82a69pyn.cloudfront.net/siteassets/images/720_talent.jpg) 参考资源链接:[SAP物料评估与移动类型深度解析](https://wenku.csdn.net/doc/6487e1d8619bb054bf57ad44?spm=1055.2635.3001.10343) # 1. SAP财务处理概述 ## SAP财务处理基础 SAP作为先进的企业资源计划(ERP)系统,其核心功能之一是财务处理。财务处理在SAP系统中扮演着关键角色,因为所有的业务交易最终都会反映在财务报表上

实验室安全隐患排查:BUPT试题解析与实战演练的终极指南

参考资源链接:[北邮实验室安全试题与答案解析](https://wenku.csdn.net/doc/12n6v787z3?spm=1055.2635.3001.10343) # 1. 实验室安全隐患排查的重要性与原则 ## 实验室安全隐患排查的重要性 在当今社会,实验室安全已成为全社会关注的焦点。实验室安全隐患排查的重要性不言而喻,它直接关系到实验人员的生命安全和身体健康。对于实验室管理者来说,确保实验室安全运行是其基本职责。忽视安全隐患排查将导致严重后果,包括环境污染、财产损失甚至人员伤亡。因此,必须强调实验室安全隐患排查的重要性,从源头上预防和控制安全事故的发生。 ## 实验室安全

【高效网络传输秘诀】:RoCEv2在高性能计算中的应用及优化

![RoCEv2](https://www.fibermall.com/blog/wp-content/uploads/2023/08/IB-vs.-RoCE.png) 参考资源链接:[InfiniBand Architecture 1.2.1: RoCEv2 IPRoutable Protocol Extension](https://wenku.csdn.net/doc/645f20cb543f8444888a9c3d?spm=1055.2635.3001.10343) # 1. RoCEv2技术概述 ## 1.1 简介 RDMA over Converged Ethernet ver

从入门到精通:V93000 Wave Scale RF训练进阶指南,专家手把手教你

![从入门到精通:V93000 Wave Scale RF训练进阶指南,专家手把手教你](https://article.murata.com/sites/default/files/static/ja-jp/images/article/5ghz-wi-fi-interference-prevention/5ghz-img0011.jpg) 参考资源链接:[Advantest V93000 Wave Scale RF 训练教程](https://wenku.csdn.net/doc/1u2r85x0y8?spm=1055.2635.3001.10343) # 1. V93000 Wave

【毫米波信道建模】:深入分析与应用,专家指南

![【毫米波信道建模】:深入分析与应用,专家指南](https://d3i71xaburhd42.cloudfront.net/06d47a99838e7a00a1218e506cf2a6f051712085/2-Figure1-1.png) 参考资源链接:[TI mmWave Studio用户指南:安装与功能详解](https://wenku.csdn.net/doc/3moqmq4ho0?spm=1055.2635.3001.10343) # 1. 毫米波信道建模的理论基础 毫米波技术,作为无线通信领域的一项突破性进展,其信道建模理论基础是研究该频段信号传播特性的关键。在深入探讨技术原
最低0.47元/天 解锁专栏
买1年送1年
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )