当前位置: 首页 > news >正文

【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可通过()初始化
    • 释放结构化元素时优先释放子内存:结构体或类中包含动态内存的指针成员时,直接释放父对象会导致子内存无法访问,从而泄露
      • 在析构函数中集中释放:类对象应在析构函数中释放所有成员管理的资源
      • 自底向上释放:先释放深层嵌套的资源,再释放外层结构

栈溢出

相关文章:

  • 大模型应用开发SpringAI实战-开发自己的MCP服务
  • 深入解析xDeepFM:结合压缩交互网络与深度神经网络的推荐系统新突破
  • Vue2,Vue3知识大全
  • 费马引理和罗尔定理
  • 解密CHASE-SQL和XiYan-SQL多智能体AI如何最终实现TEXT2SQL的突破
  • 嵌入式通信篇---通信频段
  • CSS 背景属性学习笔记
  • ‌JVM 调优核心步骤与参数配置‌‌
  • Keil调试STM32:未定义OS_EVENT以及停在“BEAB BKPT 0xAB”处等问题
  • Java微服务注册中心深度解析:环境隔离、分级模型与Eureka/Nacos对比
  • Vue3性能优化终极指南:编译策略、运行时调优与全链路监控
  • Dubbo(53)如何在Spring Boot中集成Dubbo?
  • 批量给dwg显示略缩图_c#插件实现(com)
  • Tkinter图像和多媒体处理
  • 【深度学习】PyTorch实现VGG16模型及网络层数学原理
  • OpenCV 图像拼接
  • 使用U盘安装 ubuntu 系统
  • SpringBoot 动态路由菜单 权限系统开发 菜单权限 数据库设计 不同角色对应不同权限
  • 量化交易 - 聚宽joinquant - 多因子入门研究 - 源码开源
  • 高效数据拷贝方法总结
  • 国家出口管制工作协调机制办公室部署开展打击战略矿产走私出口专项行动
  • 第一集|《刑警的日子》很生活,《执法者们》有班味
  • 比尔·盖茨:未来20年通过盖茨基金会捐出几乎全部财富,2045年底基金会停止运营
  • 盖茨:20年内将捐出几乎全部财富,盖茨基金会2045年关闭
  • 绿城房地产集团:近半年累计花费20.6亿元购买旗下债券
  • 港理大研究揭示:塑胶废物潜藏微生物群落或引发生态危机