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

栈溢出

http://www.dtcms.com/a/130958.html

相关文章:

  • 大模型应用开发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 - 多因子入门研究 - 源码开源
  • 高效数据拷贝方法总结
  • 第16届蓝桥杯c++省赛c组个人题解
  • 基于spring boot的交通旅游订票系统
  • 输入输出系统(I/O系统)
  • 记一次项目上线404--Nginx配置文件
  • 【mllm】——qnn后端解读
  • Linux多线程同步与互斥:从互斥锁原理到死锁防范的深度实践
  • Tkinter事件与绑定
  • 计算机组成原理笔记(十五)——3.5指令系统的发展
  • 使用FormData格式上传图片
  • zk(Zookeeper)实现分布式锁