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 并接管所有权左值不允许。

相关新闻

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

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

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

2026/8/11 2:48:09 阅读更多 →
多动症儿童运动干预方案与神经科学原理

多动症儿童运动干预方案与神经科学原理

1. 多动症儿童的运动干预:从现象到解决方案每次在儿童游乐区看到那些坐不住、不停跑跳的孩子,总会有家长无奈地摇头:"这孩子怎么一刻都停不下来?"作为从业十余年的儿童行为发展指导师,我必须指出&#xff1a…

2026/8/11 2:48:09 阅读更多 →
爬虫转大模型:Demo 能跑通就够?生产环境的权限和日志才是真门槛

爬虫转大模型:Demo 能跑通就够?生产环境的权限和日志才是真门槛

聊《别急着换赛道:爬虫经验在 AI 项目里到底值多少?》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。 摘要 上个月项目评审会上,产品问了一句:"这个 RAG 系统&…

2026/8/11 2:47:09 阅读更多 →

最新新闻

如何实现拼多多自动回复与客服自动化?无人值守订单处理,日发5000单零差错

如何实现拼多多自动回复与客服自动化?无人值守订单处理,日发5000单零差错

如何实现拼多多自动回复与客服自动化?无人值守订单处理,日发5000单零差错 说句掏心窝的话,做店群的,工具选对了事半功倍。拼多多的自动回复与客服,是店群运营中最耗人力也最容易出错的环节。 店群客服是纯人力消耗战…

2026/8/11 3:42:28 阅读更多 →
深圳企业服务器 RAID 崩溃应急恢复全流程:从宕机到数据起死回生的 24 小时实录

深圳企业服务器 RAID 崩溃应急恢复全流程:从宕机到数据起死回生的 24 小时实录

摘要:在深圳制造、电商、科创企业的机房中,RAID 阵列承载着 ERP、MES、财务库、订单业务等核心数据。即便 RAID 自带冗余,仍可能遭遇多盘掉线、RAID 卡故障、坏道扩散、意外断电、固件损坏。一旦阵列整体崩溃,每一小时停机都是直接…

2026/8/11 3:42:28 阅读更多 →
自用学习笔记 C语言基础篇

自用学习笔记 C语言基础篇

C基础 ver.26/08/10 1.C语言的基础概念 C语言支持结构化编程,强调程序逻辑的清晰、模块化和易维护。 C语言不完全依赖于平台,具有良好的可移植性,C语言编写的程序可以在不同的平台上编译并运行,只需要进行一些小的调整或重新编译…

2026/8/11 3:42:28 阅读更多 →
如何用抖音下载器快速保存直播回放与批量下载内容:完整入门指南

如何用抖音下载器快速保存直播回放与批量下载内容:完整入门指南

如何用抖音下载器快速保存直播回放与批量下载内容:完整入门指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…

2026/8/11 3:42:28 阅读更多 →
ETL 管道

ETL 管道

1. 什么是 ETL 管道ETL(Extract、Transform、Load)即提取、转换和加载,是一种用于数据处理的数据工程框架。在 RAG(Retrieval Augmented Generation,检索增强生成)应用中,ETL 管道负责将企业原始…

2026/8/11 3:42:28 阅读更多 →
光刻显影缺陷:桥连/残留/塌陷的排查

光刻显影缺陷:桥连/残留/塌陷的排查

一、背景故事:ADI缺陷率一夜翻了三倍六月的一个周一早上,光刻区主管脸色铁青地站在晨会白板前:周末两天,KLA扫描的ADI(光刻后检查)缺陷密度从平时的每平方厘米零点一翻到了零点三,而且缺陷类型分…

2026/8/11 3:41:27 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →