广西钦州住房与城乡建设局网站吉林省城乡住房建设厅网站

张小明 2026/1/9 18:04:11
广西钦州住房与城乡建设局网站,吉林省城乡住房建设厅网站,Html5手机静态网站设计,时尚女装网站模版目录 文章摘要 1.1 什么是智能指针 1.2 为什么需要智能指针#xff08;裸指针的痛点#xff09; 1#xff09;忘记释放 → 内存泄漏 #xff08;1#xff09;代码示例 #xff08;2#xff09;解析 #xff08;3#xff09;为什么这种泄漏很难发现 1️⃣ 短函…目录文章摘要1.1 什么是智能指针1.2 为什么需要智能指针裸指针的痛点1忘记释放 → 内存泄漏1代码示例2解析3为什么这种泄漏很难发现1️⃣ 短函数看起来没事2️⃣ 循环/长服务就爆了4更“真实”的泄漏早 return、break、continue5真实工程“灾难级例子”1️⃣不泄漏 int而是“大对象”2️⃣ 机器人 / ROS / 服务程序你场景很常见6总结2异常/多分支 return → delete 走不到C里非常关键1代码示例2“多分支 return”为什么必泄漏3例子最典型的业务写法4“异常 throw”为什么更危险5throw 发生时C 到底做了什么1️⃣ throw ≠ return2️⃣ 异常展开stack unwinding只做一件事“只会自动析构栈对象”6为什么说 throw 比 return 更危险1️⃣ return你还能“看得见”2️⃣ throw可能来自你根本没意识到的地方7对比return vs throw一眼记住8正确写法用 RAII 一把解决重点1️⃣ 错误写法2️⃣ 正确写法 1unique_ptr最推荐3️⃣ 正确写法 2用容器工程里更常见9总结1.3 用智能指针一把梭为什么它能同时解决这两种问题1用 unique_ptr 改写 f再也不用手写 delete2用 unique_ptr 改写 greturn/throw 都不怕3解释1.4 易踩雷相关点1new[] 必须 delete[]2多出口函数手动 delete 很容易写成“漏一个分支”1.5 总结文章摘要在 C 工程开发中内存泄漏往往不是因为“不知道要 delete”而是由于多分支 return、异常 throw、长期服务循环等真实业务场景导致资源释放逻辑根本“走不到”。本文从裸指针的典型使用场景出发结合短函数、循环调用、异常传播等常见工程代码系统分析了裸指针在真实项目中的三类致命问题忘记释放、多出口控制流、异常不安全。在此基础上引出RAIIResource Acquisition Is Initialization资源获取即初始化核心思想并通过unique_ptr与容器的实际示例说明为什么智能指针能够在return / throw / 正常执行等所有路径下保证资源“必然释放”。本文不追求语法堆砌而是从工程实践角度出发帮助大家真正理解为什么智能指针不是“语法糖”而是现代 C 的底层生存法则。1.1 什么是智能指针智能指针本质上不是“更聪明的指针”而是一个管理资源的类模板内部持有一个裸指针在对象生命周期结束时析构函数中自动释放资源从而避免以下经典问题1️⃣ 忘记delete导致的内存泄漏2️⃣ 多分支return导致的资源无法释放3️⃣ 异常throw时直接跳出函数delete永远走不到4️⃣ 代码维护中“后来加了分支却忘了补 delete”智能指针解决的核心问题不是“指针好不好用”而是让资源的释放行为变成“必然发生”的事情。1.2 为什么需要智能指针裸指针的痛点1忘记释放 → 内存泄漏1代码示例void f() { int* p new int(10); // ... 忘了 delete p; }2解析new int(10)向堆申请一块内存 在上面构造一个 int返回地址给p函数结束时p是局部变量会自动销毁但是销毁的是“指针变量 p”不是 p 指向的堆内存结果堆上的那块内存没人再能访问地址丢了但它还占着内存 →内存泄漏3为什么这种泄漏很难发现1️⃣短函数看起来没事程序马上结束OS 也许回收内存你以为“没影响”int main() { f(); return 0; }进程退出操作系统回收该进程占用的全部虚拟内存所以你看不到“后果”但这是 OS 在帮你擦屁股不是你代码写对了2️⃣循环/长服务就爆了循环泄漏 线性增长for (;;) { f(); // 每次泄漏 }假设实际每次泄漏 ≈ 24 字节1 秒调用 10 万次1 秒 ≈ 2.4 MB 1 分钟 ≈ 144 MB 10 分钟 ≈ 1.4 GB 服务直接 OOM内存耗尽如果 f() 里泄漏的是大对象vector、图像 buffer、点云、模型跑一会儿内存就飙升。4更“真实”的泄漏早 return、break、continue很多泄漏不是“纯忘记 delete”而是写着写着中途 return 了void f2(bool ok) { int* p new int(10); if (!ok) return; // 这里一返回delete 根本走不到 delete p; }5真实工程“灾难级例子”1️⃣不泄漏 int而是“大对象”void f() { char* buf new char[1024 * 1024]; // 1MB // 忘记 delete[] }for (;;) { f(); // 每次泄漏 1MB }几秒钟直接炸。2️⃣ 机器人 / ROS / 服务程序你场景很常见ROS node 一跑就是几小时 / 几天回调函数里 new 了东西忘记释放或异常提前 return这类 bug 在机器人系统里极其致命6总结int在大多数平台是 4 字节但一次new实际分配的内存通常大于 4 字节短程序退出时操作系统会回收内存掩盖问题而在循环或长期运行的服务中微小泄漏会不断累积最终导致内存耗尽因此必须通过RAII / 智能指针来保证异常安全和资源自动释放。2异常/多分支 return → delete 走不到C里非常关键1代码示例void g() { int* p new int[100]; if (/*error*/) return; // 泄漏 // or throw ...; // 泄漏 delete[] p; }2“多分支 return”为什么必泄漏因为delete 写在函数末尾但函数的控制流可能根本到不了末尾。你把它想成“路口很多”正常路径走到最后能 delete但只要有一个分支在 delete 前 return/exit资源就丢了3例子最典型的业务写法int g2() { int* p new int[100]; if (!init()) return -1; // 泄漏 if (!check()) return -2; // 泄漏 if (!run()) return -3; // 泄漏 delete[] p; return 0; }4“异常 throw”为什么更危险因为异常发生时函数会立刻“跳出”到上层 catch中间的代码不再执行。void g3() { int* p new int[100]; doSomething(); // 这里如果 throw delete[] p; // 永远走不到 }一旦doSomething()里throw假设void doSomething() { throw std::runtime_error(error); }那么执行流程会变成new int[100] ✅ 已执行 doSomething() ❌ 抛异常 delete[] p ❌ 不执行5throw 发生时C 到底做了什么1️⃣ throw ≠ returnreturn返回到调用者函数内后面的代码还能写、能控制throw立即中断当前函数执行一旦throw当前函数立刻停止执行控制权直接跳到最近的catch当前函数里剩余代码全部被跳过所以delete[] p; // 永远走不到2️⃣ 异常展开stack unwinding只做一件事“只会自动析构栈对象”这就是 RAII 的根想要异常安全就把资源交给一个栈对象管理。C 在异常展开stack unwinding/ 异常传播过程中时会自动调用“已经构造完成的栈对象”的析构函数不会帮你 delete 任何new出来的东西除非它被某个栈对象管理⚠️ 但注意只析构“栈对象”不会自动 delete 任何你 new 出来的堆内存你的代码里int* p new int[100];p是栈变量 → 会销毁但它指向的堆内存没人管 → 泄漏6为什么说 throw 比 return 更危险1️⃣ return你还能“看得见”if (error) return;你写代码时还能意识到“哦我 return 前是不是该 delete”2️⃣ throw可能来自你根本没意识到的地方doSomething();你不知道它内部有没有throw它调用的函数有没有throwSTL / 第三方库会不会throw异常是“隐形出口”7对比return vs throw一眼记住情况后续代码是否自动释放 new 的内存正常执行会执行取决于你是否 deletereturn不执行❌ 不会throw不执行❌ 不会throw RAII不执行✅ 会析构触发8正确写法用 RAII 一把解决重点1️⃣ 错误写法void g3() { int* p new int[100]; doSomething(); // throw - 泄漏 delete[] p; }2️⃣ 正确写法 1unique_ptr最推荐#include memory void g3() { auto p std::make_uniqueint[](100); doSomething(); // throw 也安全 } // 离开作用域自动 delete[]3️⃣ 正确写法 2用容器工程里更常见void g3() { std::vectorint v(100); doSomething(); // throw 也安全 }9总结在 C 中异常发生时函数会立刻中断执行并跳转到 catch后续代码不会执行异常展开只会析构栈对象不会自动释放通过 new 分配的堆内存因此裸指针在异常路径上极易导致内存泄漏必须通过 RAII如 unique_ptr、容器保证异常安全。1.3 用智能指针一把梭为什么它能同时解决这两种问题1用 unique_ptr 改写 f再也不用手写 delete#include memory void f() { auto p std::make_uniqueint(10); // 函数结束自动释放 }2用 unique_ptr 改写 greturn/throw 都不怕#include memory void g(bool error) { auto p std::make_uniqueint[](100); if (error) return; // ✅ 不泄漏return 前会析构 p // throw 也一样抛异常时会析构 p }3解释p是栈对象离开作用域必析构析构里释放堆资源 → 所以无论 return 还是 throw 都安全。1.4 易踩雷相关点1new[]必须delete[]int* p new int[100]; delete[] p; // ✅如果误写成delete p;是未定义行为轻则泄漏重则崩溃。2多出口函数手动 delete 很容易写成“漏一个分支”所以工程里基本原则是不要在业务代码里手写new / delete成对管理资源而是始终把资源交给 RAII 对象智能指针或容器管理。一句话总结就是只要你看到delete就应该警惕设计是否有问题。1.5 总结智能指针并不是为了“少写几行 delete”而是为了让资源释放这件事从“靠人记住”变成“由语言机制保证一定发生”。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站秒收录秒排名一个网站建设需要多少人力

还在为三角面模型的重拓扑而烦恼吗?QRemeshify这款强大的Blender插件能够将复杂的三角网格一键转换为规整的四边形拓扑结构。无论你是3D建模新手还是专业人士,这款免费工具都能让你的工作流程发生质的飞跃!✨ 【免费下载链接】QRemeshify A B…

张小明 2026/1/9 5:40:32 网站建设

震天建设集团网站做网站怎样安全采集

Langchain-Chatchat移民政策查询:各国居留条件对比分析 在跨国人才流动日益频繁的今天,一个常见的咨询场景是:“我本科学历、雅思7分、有五年IT工作经验,能移民加拿大还是澳大利亚?”面对这类涉及多国政策、动态标准和…

张小明 2026/1/4 23:29:17 网站建设

wordpress最新文章链接插件怎样做网站性能优化

第一章:你还在手动调参?Open-AutoGLM 2.0云机已实现99.2%自动化模型编译成功率在深度学习模型开发中,超参数调优长期依赖人工经验,耗时且难以复现。Open-AutoGLM 2.0 的发布彻底改变了这一局面,其集成的智能编译引擎通…

张小明 2026/1/4 23:29:15 网站建设

客户在我这做的网站被罚建网站用什么软件最简单

Unity开发实用技巧与优化策略 1. 嵌套协程与API历史查询 1.1 嵌套协程 嵌套协程是脚本编写中一个有趣且实用但文档较少的领域。可参考第三方博客文章获取更多详细信息: http://www.zingweb.com/blog/2013/02/05/unity-coroutine-wrapper 1.2 API历史查询 可通过访问 h…

张小明 2026/1/4 23:29:13 网站建设

天津网站制作企业凡科建设网站图片怎么删除

人工智能如何重塑未来工作格局:机遇与挑战并存的职场新生态 【免费下载链接】VisionReward-Image-bf16 项目地址: https://ai.gitcode.com/zai-org/VisionReward-Image-bf16 在当今数字化浪潮席卷全球的背景下,人工智能技术正以前所未有的速度和…

张小明 2026/1/4 23:29:12 网站建设

济源网站建设济源网站备案 拍照

2025年成为网络安全领域的关键转折点,零点击漏洞利用技术显著进化,彻底颠覆了我们对数字安全的认知。与传统攻击需要用户点击恶意链接或下载感染文件不同,零点击漏洞利用在暗处运作,无需受害者任何操作即可悄无声息地入侵设备。这…

张小明 2026/1/8 21:31:19 网站建设