C++的std::unique_ptr关键字有什么用途?怎么用?

std::unique_ptr是c++++11引入的智能指针,用于实现独占式所有权的资源管理。其核心用途是确保某个资源只能被一个指针拥有,并在离开作用域时自动释放,避免内存泄漏;“独占式”意味着资源不能被复制,但可以通过移动语义转移所有权;创建方式包括使用new直接初始化、推荐的std::make_unique以及管理数组类型的带[]删除器形式;访问资源可通过*和->操作符进行;所有权转移通过std::move实现,转移后原指针为空;常见注意事项包括不要手动delete资源、可安全放入容器中使用、支持自定义删除器以管理非内存资源。

C++的std::unique_ptr关键字有什么用途?怎么用?

std::unique_ptr 是 C++11 引入的一种智能指针,用来管理动态分配的对象,它的核心用途是实现独占式所有权的资源管理。说白了,就是确保某个资源(通常是堆内存)只能被一个指针拥有,并在它不再需要时自动释放,避免内存泄漏。

什么是“独占式”?

“独占式”意味着 std::unique_ptr 所指向的对象不能被复制给另一个 unique_ptr。也就是说,你不能写这样的代码:

std::unique_ptr p1(new int(5));std::unique_ptr p2 = p1; // 编译错误!

这和 std::shared_ptr 不一样,后者允许多个指针共享同一个对象的所有权。而 unique_ptr 的设计目的就是为了更明确地表达:这个资源只能有一个主人,谁离开作用域谁就负责释放。

立即学习“C++免费学习笔记(深入)”;

怎么创建和使用 std::unique_ptr?

常见的用法其实很简单,一般有以下几种方式:

使用 new 直接初始化:

std::unique_ptr ptr(new int(10));

使用 std::make_unique(推荐):

auto ptr = std::make_unique(10);

这种方式更安全,也更简洁,推荐优先使用。

管理数组类型(注意要用带 [] 的删除器):

auto arr = std::make_unique(5); // 创建长度为5的int数组

访问内部对象也很简单,就像普通指针一样用 *-> 操作符:

auto user = std::make_unique("Alice");std::cout <getName() << std::endl;

如何转移所有权?

虽然 unique_ptr 不支持拷贝,但可以移动(move)。比如你可以把它作为函数返回值或者参数传递出去:

std::unique_ptr createInt() {    return std::make_unique(42);}void useInt(std::unique_ptr ptr) {    std::cout << *ptr << std::endl;}

调用方式如下:

auto p = createInt(); // 所有权从函数内转移到puseInt(std::move(p)); // 转移后,p变成空指针

注意:一旦移动之后,原来的指针就不再拥有资源了,相当于 null。

常见注意事项

不要手动 delete:用了 unique_ptr 就不需要也不应该手动调用 delete

配合容器使用没问题:可以把 unique_ptr 放进 std::vectorstd::map 中,只要不涉及拷贝操作就行。

自定义删除器(高级用法):如果你管理的不是普通 new 出来的内存,比如文件句柄、socket 等资源,可以通过模板指定自定义删除逻辑。

struct MyDeleter {    void operator()(FILE* fp) const { fclose(fp); }};std::unique_ptr fp(fopen("file.txt", "r"));

基本上就这些。理解起来不难,但确实很容易因为习惯写法而出错,特别是刚从裸指针转过来的时候。用多了你会发现,std::unique_ptr 不仅能帮你省去手动管理内存的麻烦,还能让代码结构更清晰。

以上就是C++的std::unique_ptr关键字有什么用途?怎么用?的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++中=是什么意思 赋值运算符使用规范
上一篇 2025年12月18日 14:34:16
c++中π怎么表示 c++中定义π常量的两种方法
下一篇 2025年12月18日 14:34:32

相关推荐

  • 使用Groovy方法返回值与Shell命令交互的教程

    本教程详细阐述了如何在jenkins groovy脚本中,将groovy方法返回的动态数据(如api响应中的url)安全有效地传递给后续的shell命令执行。通过分析常见的“could not resolve host”错误,本文重点讲解了groovy变量与shell命令之间正确的数据传递机制,特别…

    2026年9月5日
    000
  • Java Integer数组元素为何无法直接调用Integer方法?

    Java中Integer数组元素无法直接调用Integer方法的原因及解决方法 在Java编程中,使用Integer[]声明的整数数组,其元素并非Integer对象,而是int类型的值。 这导致直接调用Integer类的方法(例如toString())会引发NullPointerException异…

    2026年9月5日
    100
  • 《天国:拯救 II》史低折扣来袭!中世纪史诗再临

    《天国:拯救 II》史低折扣来袭!中世纪史诗再临《天国:拯救 II》史低折扣来袭!中世纪史诗再临《天国:拯救 II》史低折扣来袭!中世纪史诗再临《天国:拯救 II》史低折扣来袭!中世纪史诗再临

    《天国:拯救 II》即将于 6月16日至6月23日 登陆 Steam 周中特惠,带来前所未有的折扣力度!活动期间,标准版与黄金版均可享受限时 8 折优惠,“生死绘梦”DLC及相关扩展包则享限时 9 折特惠。 Steam商店页面链接如下:https://www.php.cn/link/37b8f643…

    2026年9月5日 用户投稿
    100
  • JNA调用C++ DLL时出现异常,如何避免JVM崩溃?

    JNA调用C DLL异常处理及JVM崩溃避免策略 使用JNA调用C DLL时,DLL内部抛出的异常可能导致JVM崩溃。这是因为JNA依赖JNI,而JNI在异常处理方面缺乏对C++异常的直接捕获机制。 Java端无法捕获C++异常,导致JVM将此视为未处理异常并终止进程。 Java端无法捕获C++异常…

    2026年9月5日
    000
  • 如何优化MCU中断响应时间

    中断响应时间由硬件延迟和软件延迟共同构成。 硬件延迟包括中断信号传输时间、流水线刷新周期和寄存器压栈时间,通常占整个响应时间的30%-40%。 软件延迟则涉及中断服务程序(ISR)的进入/退出机制、优先级判断和上下文保存等操作,其优化空间可达60%以上。 在Cortex-M3架构的典型场景中,从中断…

    2026年9月5日
    100
  • 《无主之地4》采用D加密技术 PC配置需求公布

    《无主之地4》采用D加密技术 PC配置需求公布《无主之地4》采用D加密技术 PC配置需求公布《无主之地4》采用D加密技术 PC配置需求公布《无主之地4》采用D加密技术 PC配置需求公布

    近日,2k games正式宣布《无主之地4》已开放预购,并同步发布了游戏的pc配置要求。根据官方信息,玩家至少需要配备intel core i7-9700或amd ryzen 7 2700x处理器、nvidia geforce rtx 2070显卡、16gb内存以及100gb存储空间。此外,本作将继…

    2026年9月5日 用户投稿
    300
  • 幽默卡表!《怪猎荒野》改公告三月一龙引众怒!

    幽默卡表!《怪猎荒野》改公告三月一龙引众怒!幽默卡表!《怪猎荒野》改公告三月一龙引众怒!幽默卡表!《怪猎荒野》改公告三月一龙引众怒!幽默卡表!《怪猎荒野》改公告三月一龙引众怒!

    此前,卡普空曾发布公告预告《怪物猎人:荒野》的第二弹免费更新将在6月末上线,内容包括新增多个怪物、武器配装等要素。然而,在最新发布的路线图中,措辞已由复数形式“monsters”改为单数“additional monster”,这一变化让不少玩家认为新增怪物数量被削减至仅一只,从而引发担忧。 此改动…

    2026年9月5日 用户投稿
    200
  • MySQL多语句执行存在风险吗_如何安全执行批量SQL?

    mysql多语句执行存在sql注入、意外数据修改删除、性能问题、事务原子性破坏等风险。1.优先使用参数化查询防止sql注入;2.通过事务管理确保批量操作的原子性;3.实施严格权限控制降低滥用风险;4.完善错误处理和日志记录机制;5.考虑使用load data infile等专用工具提升效率。选择策略…

    2026年9月5日
    300
  • PHP中基于日期条件动态过滤数组元素教程

    本教程旨在解决PHP中根据数组元素的日期字段(例如“激活日期”)动态过滤和移除不符合条件的元素的问题。我们将详细介绍如何利用strtotime()函数将日期字符串转换为可比较的Unix时间戳,并通过遍历和unset()操作实现精确的条件过滤,确保数据处理的准确性和效率。 1. 问题背景:根据日期条件…

    2026年9月5日
    300
  • Redis并发下LPOP为空:多个协程同时取值如何避免数据丢失?

    Redis并发环境下LPOP操作为空的解析 在高并发环境下使用Redis的LPOP命令,经常会遇到获取空值的情况,即使在单线程环境下运行良好。这是因为多个协程同时竞争列表中的元素,导致数据竞争和丢失。 例如,以下代码片段使用管道批量从Redis列表中弹出100个元素: $prizes = $this…

    2026年9月5日
    100
  • 月底新品盛宴!小米YU7与小米MIX Flip2小折叠手机将同台登场

    月底新品盛宴!小米YU7与小米MIX Flip2小折叠手机将同台登场月底新品盛宴!小米YU7与小米MIX Flip2小折叠手机将同台登场月底新品盛宴!小米YU7与小米MIX Flip2小折叠手机将同台登场月底新品盛宴!小米YU7与小米MIX Flip2小折叠手机将同台登场

    6月16日消息,小米集团董事长雷军发博称,万众期待的小米yu7将于6月底发布,同时还将带来多款重磅新品,例如搭载玄戒o1芯片的小米平板7s pro。 另外,在该博文底下的评论区里也透露了更多新品的消息。例如雷总与网友互动的这条回复中,我们推测月底的发布会还将带来全新的小折叠屏手机,也就是小米MIX …

    2026年9月5日 用户投稿
    100
  • 红米K80至尊版定档6月底:天玑9400+配7000+mAh电池

    6月17日消息,小米redmi k80至尊版手机即将于本月正式登场,知名博主@数码闲聊站 近日曝光了该机的部分配置信息。作为红米2025年的重磅旗舰产品,k80至尊版或将凭借“天玑9400+旗舰处理器”与“7000+mah硅碳负极大容量电池”的创新组合,向中端性能王者发起冲击。 据悉,红米K80至尊…

    2026年9月5日
    100
  • Claude和ChatGPT有什么区别_Claude与ChatGPT功能对比分析

    Claude在长文本处理和复杂指令遵循上具有显著优势,主要得益于其超大上下文窗口(可达20万token)和“宪法式AI”训练机制。这使得它能同时处理大量文本信息,在法律合同分析、技术文档总结、代码库审查等场景中表现优异。其强大的上下文记忆能力确保了长时间多轮对话的连贯性,不易“失忆”或跑题。同时,宪…

    2026年9月5日
    100
  • Java基础开发者学习Spring Boot需要多久?

    Java程序员进阶Spring Boot:学习时间评估 对于具备Java基础的开发者而言,Spring Boot的学习时间取决于其Java基础的扎实程度。 Java基础知识自测 文中提及的《Java核心技术》上下两卷,涵盖了Java SE的核心概念,例如基本语法、数据结构、算法及异常处理等。这些知识…

    2026年9月5日
    100
  • Java基础扎实,学习Spring Boot需要多久?

    从Java高手到Spring Boot达人:需要多久? Java基础扎实,学习Spring Boot 的时间取决于个人情况,包括Java技能水平、学习方法和学习时间投入。 影响学习速度的因素: Java功底: Java核心知识(如面向对象编程、数据结构和算法)掌握程度越高,学习Spring Boot…

    2026年9月4日
    100
  • 谷歌电脑进化史下载指南_资源获取方式与途径

    下载谷歌电脑进化史资源的核心在于分步挖掘可靠源头并选择合适方法获取,1.优先从谷歌官方博客、github开源平台、学术数据库及互联网档案馆等权威渠道查找第一手资料;2.根据资源类型采取对应下载方式,代码通过github克隆,文档下载pdf,软件寻找官方安装包;3.使用虚拟机或模拟器解决旧软件兼容问题…

    2026年9月4日
    100
  • switch520热门游戏资源导航-switch520白嫖网最新入口地址

    获取switch游戏资源最安全有效的方式是通过官方渠道和可信赖的社区,而非所谓的“白嫖网”。2. nintendo eshop不仅提供完整的游戏信息和愿望单功能,还会定期推出折扣活动,是获取正版游戏和优惠的核心平台。3. 国内外专业游戏媒体与社区(如ign、nga、a9vg等)能提供真实评测、玩家讨…

    2026年9月4日
    100
  • MySQL中如何安全管理数据库用户和权限_最佳安全实践?

    MySQL中如何安全管理数据库用户和权限_最佳安全实践?MySQL中如何安全管理数据库用户和权限_最佳安全实践?MySQL中如何安全管理数据库用户和权限_最佳安全实践?MySQL中如何安全管理数据库用户和权限_最佳安全实践?

    mysql数据库安全管理需遵循四大核心原则:1.最小权限原则,按用户角色分配必要权限,如应用账号仅赋予select、insert、update;2.禁用root远程访问,创建受限管理账号并限制访问源ip,结合ssh隧道加密连接;3.定期审查清理无效账号,启用审计插件记录操作日志;4.设置强密码策略并…

    2026年9月4日 用户投稿
    100
  • Java Stream API处理嵌套Map时保留原始结构的最佳实践

    本文详细阐述了如何使用java stream api过滤嵌套map结构(例如`vehicle`对象中的`services`),同时确保原始父对象(`vehicle`)的非过滤字段(如`name`和`model`)得以保留。核心策略是遍历主map,对嵌套map进行过滤,然后利用原始数据和过滤后的嵌套数…

    2026年9月4日
    100
  • 告别繁琐的LinkedIn API交互:使用Composer简化开发流程

    最近我负责一个项目,需要将公司内部系统与linkedin进行集成,实现用户使用linkedin账号登录以及在linkedin上分享公司动态的功能。起初,我尝试直接使用php的curl库和oauth 2.0流程来与linkedin api进行交互。虽然最终实现了功能,但代码写得非常冗长,充满了大量的o…

    用户投稿 2026年9月4日
    100

发表回复

登录后才能评论
关注微信