【C++】019、内存泄漏

发布时间:2026/9/18 16:08:43
【C++】019、内存泄漏 一、内存泄漏定义指程序在动态分配内存后失去了对该内存块的所有指针引用导致在程序内存生命周期结束前无法被释放或回收的现象二、内存泄漏的三大根本原因1、遗忘释放写了new、malloc但忘了写对应的delete、free常见于业务逻辑及其复杂的函数中开发者在return前遗漏了释放内存的代码。2、异常路径打乱流程函数执行过程中抛出了异常直接跳过了后面的delete语句导致之前分配的内存无法释放。3、释放姿势错误基类析构函数没有声明为虚函数virtual当用基类指针指向派生类对象并delete时派生类的析构函数不会执行导致派生类自身持有的堆资源随即泄漏。三、四大常见内存泄漏场景1、循环中的临时对象在while或for循环中持续的new对象却忘了在循环末尾delete是短时间内将内存耗尽OOM的最快方式2、容器中的裸指针vector中存放了new出来的裸指针当vector被销毁或清空时只会释放容器自身空间不会自动delete这些指针指向的元素。3、跨模块内存管理在一个动态库中dll、sonew内存却在另一个模块中delete在so库文件中申请内存却在调用exe文件中对该对象内存进行释放如果两个模块链接了不同的运行时库堆管理结构不一致导致泄漏或崩溃。4、线程局部存储未清理线程结束时未清理线程局部存储中的堆指针导致泄漏。四、内存泄漏监测工具1、valgrind原理是通过跟踪每次内存读写和释放可以定位到内存泄漏的代码行号缺点是会让程序运行速度变慢10-50倍。2、Asan通过影子内存哨兵内存的技术实时监测速度快能够精准捕获堆溢出栈溢出和内存泄漏。3、window平台CRT调试钩子4、内存钩子Hook重载operate new也就是插桩技术重载全局operate new和operate delete实时打印未释放的存活对象。五、shared_ptr 循环引用导致的逻辑泄漏如果两个对象互相持有shared_ptr引用计数永远降不到0析构函数永远不会调用。六、预防内存泄漏的工程实战杜绝裸new、delete强制使用RAII使用unique_ptr,shared_ptr, 让堆内存的生命周期绑定到栈对象上。利用栈的自动析构特性从根源上消除忘记释放和异常跳过释放的问题。当需要自定义内存池时才允许使用 placement new和显示析构。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询