欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 【C++】内存分配与释放、内存碎片、内存泄漏、栈溢出

【C++】内存分配与释放、内存碎片、内存泄漏、栈溢出

2025/5/12 6:32:23 来源:https://blog.csdn.net/qq_64751004/article/details/147195661  浏览:    关键词:【C++】内存分配与释放、内存碎片、内存泄漏、栈溢出

C++内存分配方式 

内存分配方式区别

特性

静态分配

栈分配

堆分配

分配时机

编译期

函数调用时

运行期(new

释放方式

自动释放

函数结束自动释放

手动delete释放

内存区域

静态存储区

堆(自由存储区)

大小灵活性

固定

固定

动态可调

分配速度

极快

较慢(需堆管理)

作用域控制

全局 / 静态局部

函数内局部

程序员显式控制

常见问题

栈溢出

内存碎片、泄漏

内存碎片

内存泄漏

  • 程序未释放不再使用的内存,导致可用内存逐渐减少
  • 常见原因:
    • 忘记调用delete或者free()
    • 异常导致未执行释放代码(new后抛出异常)
    • 循环引用(shared_ptr互相引用)
    • 指针被覆盖:int* p = new int; p = new int;(第一个 new 泄漏)。
  • 检查工具:
    • Valgrind(Linux):通过动态二进制插装检测内存泄漏,支持new/malloc等分配方式
    • Visual Studio 调试工具:利用 “内存诊断” 功能追踪堆分配,定位泄漏位置。
    • VLD :Windows CRT内存跟踪
  • 解决方案:
    • 显式释放动态分配的内存
      • 使用智能指针或容器自动管理资源
      • 配对使用内存分配与释放函数
    • 分配内存后及时初始化,未初始化的内存可能包含垃圾值
      • malloc结合memset函数手动初始化
      • calloc或值初始化(calloc自动初始化为0,new可通过()初始化
    • 释放结构化元素时优先释放子内存:结构体或类中包含动态内存的指针成员时,直接释放父对象会导致子内存无法访问,从而泄露
      • 在析构函数中集中释放:类对象应在析构函数中释放所有成员管理的资源
      • 自底向上释放:先释放深层嵌套的资源,再释放外层结构

栈溢出

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词