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/10/12 5:31:58 阅读更多 →
多动症儿童运动干预方案与神经科学原理

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

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

2026/10/9 7:57:55 阅读更多 →
爬虫转大模型:Demo 能跑通就够?生产环境的权限和日志才是真门槛

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

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

2026/9/25 22:35:05 阅读更多 →

最新新闻

DeepSeek AI接入企业微信:从API到聊天机器人的完整实现指南

DeepSeek AI接入企业微信:从API到聊天机器人的完整实现指南

简介:这是一套将DeepSeek大模型接入微信聊天的完整工程实现,适合具备基础Python技能、希望为个人微信账号提供智能对话能力的开发者。项目从模型加载、消息收发到前端交互均有配套代码,支持文本对话、Web界面操作,并附带文档上传与…

2026/10/12 17:53:21 阅读更多 →
Python数据分析实战:双十一美妆销售数据清洗与可视化

Python数据分析实战:双十一美妆销售数据清洗与可视化

简介:这份Python示例源码面向数据分析初学者与高校学生,以天猫双十一美妆销售数据为对象,演示从数据清洗、转换到可视化呈现的完整分析流程,适合用作课程大作业或数据分析入门练手项目。压缩包共17个文件、约5.08MB,包…

2026/10/12 17:53:21 阅读更多 →
汽车零件机器视觉检测:OpenCV工业落地实操指南

汽车零件机器视觉检测:OpenCV工业落地实操指南

简介:本资源是一篇发表于《汽车工艺与材料》2023年第7期的工程应用型技术论文,面向汽车制造企业工程师、智能制造方向研究人员及高校自动化/车辆工程专业师生,聚焦多车型混线生产中零件错装、漏装等质量管控难题。论文提出并实现了基于YOLOv5…

2026/10/12 17:53:21 阅读更多 →
药源网Scrapy爬虫实战:10万药品数据采集与跨源校验

药源网Scrapy爬虫实战:10万药品数据采集与跨源校验

简介:本资源是一套基于Python开发的药品数据采集与建库系统,面向计算机、电子信息及生物信息相关专业学生与初阶开发者,解决药品结构化数据获取难、数据库建设门槛高的实际问题。压缩包共51个文件,含23个核心Python脚本&#xff0…

2026/10/12 17:53:21 阅读更多 →
Python旅游推荐数据分析可视化:从数据清洗到协同过滤全流程实战

Python旅游推荐数据分析可视化:从数据清洗到协同过滤全流程实战

简介:这是一套基于Python、Django与MySQL的旅游推荐数据分析可视化项目,专为计算机相关专业毕业设计、课程设计及期末大作业设计,同时适合需要项目实战的Python学习者。项目内置协同过滤推荐算法,实现用户登录注册、个人信息管理、…

2026/10/12 17:53:21 阅读更多 →
Qt JSON实战指南:解析、序列化与避坑要点

Qt JSON实战指南:解析、序列化与避坑要点

很多刚接触Qt的开发者会在Json选型上纠结:到底用自带的QJsonDocument,还是引入第三方Json库。我的建议很简单——如果项目本身就是Qt技术栈,自带的Json支持完全够用,而且从Qt 5到Qt 6,这套API一直稳定保留。这篇文章不…

2026/10/12 17:52:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →