19. 智能指针下

发布时间:2026/8/11 2:48:04

19. 智能指针下
auto_ptr 的所有权模型及其问题auto_ptr 采用所有权模型赋值语句 pwin films[2]; 把字符串对象的所有权从 films[2] 转让给 pwin导致 films[2] 不再引用该字符串。因为转让所有权可防止两个指针的析构函数试图删除同一个对象但 auto_ptr 放弃对象所有权后程序仍可能使用它访问该对象——打印 films[2] 指向的字符串时发现它是空指针这是令人讨厌的意外错误使用 auto_ptr 的行为是不确定的可能导致段错误segmentation fault。使用 shared_ptr 更安全。std::auto_ptrstd::string pwin; pwin films[2]; // 所有权从 films[2] 转让给 pwin // 此后 films[2] 不再指向有效数据继续使用它访问对象将崩溃 ​ std::shared_ptrstd::string pwin2; pwin2 films2[2]; // 引用计数 1两个指针指向同一对象 // 最后一个指针过期时引用计数降为 0才释放内存unique_ptr 优于 auto_ptr区分右值与左值与 auto_ptr 一样unique_ptr 采用所有权模型但策略更严格。程序试图把一个 unique_ptr 赋给另一个时若源 unique_ptr 是临时右值rvalue编译器允许这样做若源 unique_ptr 将存在一段时间左值lvalue编译器禁止这样做。语句 p2 p1;左值被禁止。避免了“p1 不再指向有效数据”的问题这是 unique_ptr 比 auto_ptr 更安全的原因。若确实想执行这类赋值可使用标准库函数 std::move() 显式转移所有权。这种随情况而异的行为也是“禁止只是建议编译器并不禁止在容器对象中使用 auto_ptr但允许使用 unique_ptr”的原因——容器算法对包含 unique_ptr 的容器执行类似左值赋值的操作将导致编译错误执行类似右值赋值的操作则没问题。std::unique_ptrstd::string p3(new std::string(auto)); std::unique_ptrstd::string p4; // p4 p3; // 编译错误源 p3 是左值将留下悬挂指针 std::unique_ptrstd::string p5; p5 std::unique_ptrstd::string(new std::string(Yo!)); // 允许临时右值 ​ // 需要显式转移所有权时使用 std::move // std::unique_ptrstd::string p6; // p6 std::move(p3); // 显式转移p3 变为空unique_ptr 的数组变体unique_ptr 有一个可用于数组的变体。必须将 delete 与 new 配对、将 delete[] 与 new[] 配对模板 auto_ptr 使用 delete 而不是 delete[]因此只能与 new 一起使用不能与 new[] 一起使用而 unique_ptr 有使用 new[] 和 delete[] 的版本。使用 new 分配内存时才能使用 auto_ptr 和 shared_ptr使用 new[] 分配内存时不能使用它们// auto_ptr 使用 delete只能与 new 配合 std::auto_ptrdouble pd(new double(5.0)); // 合法new ​ // unique_ptr 有数组版本使用 new[] 与 delete[] std::unique_ptrdouble[] pda(new double[5]); // 合法new[] // 注意auto_ptr 不能与 new[] 一起使用选择智能指针选 shared_ptr多个对象需要同时持有同一块资源的。如指针数组、两个对象互相指向、STL 容器里存指针。选 unique_ptr一个资源只有一个“主人”不能被复制只能被转移。如函数用 new 分配内存并返回指向该内存的指针把返回类型声明为 unique_ptr 是不错的选择——所有权将转让给接受返回值的对象该智能指针负责调用 delete。按值传递 unique_ptr 非法按引用传递可以。// 函数返回临时 unique_ptr所有权转让给接收方 std::unique_ptrint make_int(int n) { return std::unique_ptrint(new int(n)); // 返回临时对象 } ​ void show(std::unique_ptrint pi) { // 按引用传递按值传递非法 // 使用 *pi } ​ std::vectorstd::unique_ptrint vp(10); // 容器可存 unique_ptr vp.push_back(make_int(5)); // 合法参数是临时右值 // std::for_each(vp.begin(), vp.end(), show); // show 按引用接收合法unique_ptr 到 shared_ptr 的转换unique_ptr 为右值时可将其赋给 shared_ptr。shared_ptr 允许从 unique_ptr 右值隐式构造但禁止从左值拷贝构造。std::unique_ptrint pup(make_int(10)); // 左值 unique_ptr // std::shared_ptrint spp(pup); // 不允许pup 是左值 std::shared_ptrint spr(make_int(10)); // 允许参数是临时右值 // shared_ptr 的显式构造函数接管右值 unique_ptr 所有的对象智能指针的内存开销对比定义是什么在 64 位系统上unique_ptr 对象大小为 8 字节、无额外开销shared_ptr 为 16 字节指向对象 指向控制块另有控制块引用计数、删除器等weak_ptr 为 16 字节与控制块共享。知识点描述智能指针的必要性智能指针是行为类似指针且有析构函数的类对象过期时自动释放内存解决忘记 delete 与异常路径导致的内存泄漏auto_ptr为 C98 方案C11 已摒弃。三种智能指针与基本使用auto_ptr、unique_ptr、shared_ptr定义于memory、位于std将new地址赋给对象过期时析构函数用delete释放。explicit 构造函数与指针行为构造函数explicit禁止指针隐式转智能指针支持*ps、ps-、赋给常规指针等操作不能指向非堆内存会对栈对象执行 delete。赋值问题与三种策略两指针指向同一对象导致双重删除对策为深复制、所有权转让auto_ptr/unique_ptr、引用计数shared_ptr仅最后一个指针过期才 delete。auto_ptr 的问题赋值转让所有权后原指针成为空指针继续使用导致运行期崩溃行为不确定随系统而异shared_ptr 因引用计数运行正常。unique_ptr 优于 auto_ptr源为临时右值时允许赋值、为左值时编译期禁止避免悬挂指针编译阶段错误比运行期崩溃安全std::move()显式转移所有权。unique_ptr 的数组变体auto_ptr 用delete只能配newunique_ptr 有new[]/delete[]版本各智能指针须按对应分配方式使用。选择智能指针多指针指向同一对象指针数组、互相引用、STL 容器用shared_ptr单所有权、函数返回分配内存用unique_ptr容器可存 unique_ptr 但不可调用复制/赋值类算法。unique_ptr 到 shared_ptr 转换右值 unique_ptr 可经 shared_ptr 显式构造函数转为 shared_ptr 并接管所有权左值不允许。

相关新闻

团队协同工具选型与高效协作实践指南

团队协同工具选型与高效协作实践指南

2026/8/11 2:48:04

1. 为什么团队协同工具越来越重要记得2015年我刚带团队时,大家还在用邮件ExcelQQ三件套协作。每次版本发布前,光是收集各部门进度就要花两天,版本说明文档要在十几个群里反复转发。现在回想起来,这种工作方式简直像在用算盘做大数…

锂电池裁切喷码产线PLC控制实战解析

锂电池裁切喷码产线PLC控制实战解析

2026/8/11 2:38:04

1. 锂电池裁切喷码产线的PLC老司机手记在锂电池制造领域,裁切和喷码是两道关键的后道工序。作为产线的"神经中枢",PLC控制系统的稳定性和精确度直接决定了产品质量和生产效率。今天我就以三菱FX5U PLC搭配普洛菲斯触摸屏的实际项目为例&#x…

宽压大电流同步降压优选|CN3906 DC-DC 电源芯片,车载 / 工控 / IoT 全能供电方案

宽压大电流同步降压优选|CN3906 DC-DC 电源芯片,车载 / 工控 / IoT 全能供电方案

2026/8/11 2:38:04

还在为宽输入、大负载、低 EMI 的降压电源选型发愁?芯维尔 CHIPNEED 推出的CN3906同步 DCM 降压转换器,凭借 4.5–32V 超宽输入、4A 持续输出、360kHz 固定开关频率,一站式解决车载、工业设备、便携仪器、IoT 终端的供电痛点,小封…

Unity Shader自动化对比工具:从原理到实践,打造视觉回归测试

Unity Shader自动化对比工具:从原理到实践,打造视觉回归测试

2026/8/11 5:38:13

1. 项目概述:为什么我们需要一个Shader效果自动化对比工具?在Unity开发中,Shader是创造视觉魔法的核心。无论是实现一个逼真的水面反射,还是一个风格化的卡通渲染,Shader的编写和调试都占据了美术和TA(技术…

AI 可观测性开发短记:证据链怎样保留

AI 可观测性开发短记:证据链怎样保留

2026/8/11 5:38:13

AI 可观测性开发短记:证据链怎样保留 处理AI 基础设施时,我会先拿到请求入口、依赖调用和运行信号采集的现状材料:接口定义、部署清单或运行记录。没有这些材料,讨论“典型线上故障的定位证据链”很容易变成套话。 AI 应用基础设施…

让大模型跑在小芯片上的工程挑战记录:部署前别漏掉这些配置

让大模型跑在小芯片上的工程挑战记录:部署前别漏掉这些配置

2026/8/11 5:38:13

让大模型跑在小芯片上的工程挑战记录:部署前别漏掉这些配置 在 8GB 甚至 4GB 内存的端侧板卡上部署 3B / 0.5B 级别的端侧小语言模型(SLM),极度考验底层工程治理。许多项目在开发阶段运行良好,一放到生产环境&#xff…

OpenStack存储卷卸载(Detach)操作全解析与运维实践

OpenStack存储卷卸载(Detach)操作全解析与运维实践

2026/8/11 5:38:13

1. 运维视角下的Detach Volume操作本质在OpenStack的日常运维中,存储卷(Volume)的挂载(Attach)与卸载(Detach)是最基础也最频繁的操作之一。表面看这只是简单的存储资源分配与回收,但实际运维中这个操作涉及存储后端、计算节点、虚拟化层和网络配置的多方…

《新建文件夹》游戏启示:从数字混沌到有序创作的实用框架

《新建文件夹》游戏启示:从数字混沌到有序创作的实用框架

2026/8/11 5:38:13

你有没有遇到过那种情况——一个项目文件夹,名字就叫“新建文件夹”,里面塞满了各种半成品、废弃的草稿、临时测试文件,还有一堆你自己都忘了是干嘛用的东西。它像一个数字黑洞,吞噬着你的时间和精力,每次打开都需要鼓…

LangChain.js工具链实战:赋予大语言模型外部调用能力

LangChain.js工具链实战:赋予大语言模型外部调用能力

2026/8/11 5:28:13

1. 项目概述:LangChain.js 工具链的实战价值 如果你正在用LangChain.js构建AI应用,大概率会遇到一个核心痛点:大语言模型(LLM)本身就像一个知识渊博但“手无寸铁”的顾问。它能和你聊得天花乱坠,但当你需要…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/10 5:58:32

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/10 7:54:12

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/10 7:19:21

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

Unity新手入门:从零搭建开发环境与核心概念解析

Unity新手入门:从零搭建开发环境与核心概念解析

2026/8/11 0:07:41

1. 项目概述:为什么Unity是游戏开发者的首选起点如果你对游戏开发感兴趣,或者想进入这个充满创造力的行业,那么“Unity”这个名字你肯定不陌生。它几乎是所有新手开发者、独立游戏团队,甚至是一些3A大厂在特定项目上的首选引擎。为…

Agency-Agents 智能体系统从零搭建实战指南

Agency-Agents 智能体系统从零搭建实战指南

2026/8/11 0:07:41

在开发复杂应用时,我们常常遇到单一模型难以兼顾全局规划与细节执行的困境。有时候,模型擅长创意生成却在逻辑推理上稍显吃力,或者精于代码编写却缺乏对业务上下文的深刻理解。为了解决这个问题,多智能体协作架构应运而生&#xf…

MiniMax 权益码 Token Plan 套餐 9 折优惠,Token Plan 共建邀请计划 至2026.8.31

MiniMax 权益码 Token Plan 套餐 9 折优惠,Token Plan 共建邀请计划 至2026.8.31

2026/8/11 0:07:41

🚀 MiniMax Token Plan MiniMax 推出全新 Token 计划,新增语音、音乐、视频和图片生成权益。 用户邀请好友可享双重福利 订阅一份套餐,解锁最新模型 —— 前沿 Coding 能力、1M 超长上下文、原生多模态,图文音视频共用套餐额度。 …

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/9 13:42:46

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/8 2:30:15

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…