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

我对于内存相关的三个问题的理解和总结——内存泄漏、内存溢出、野指针

内存泄漏累积起来会导致堆溢出,堆溢出和栈溢出构成内存溢出,本文还补充说明了野指针
(归纳自各种文章)

内存泄漏:

  • 定义

    指程序中动态分配的堆内存由于某种原因未被程序释放,造成系统内存的浪费,导致程序运行速度减慢甚至崩溃

  • 典型案例

    malloc、new之后没有及时free、delete

  • 解决方案

    • 在使用完动态分配的内存后,要及时释放
  • 排查

    • 代码审查、单元测试、使用内存检查工具

内存溢出(内存被破坏):

  • 定义

    指在对内存执行写操作的时候,由于超出了内存本身的大小(堆溢出、栈溢出)而写入到其他地方,导致其他内存块被写入数据,严重情况下会导致程序崩溃

  • 堆溢出

    程序中申请了大量动态内存,但未正确释放,后续导致内存耗尽

    这里可见内存泄漏是内存溢出(堆溢出)的原因之一,内存泄漏积累起来会导致内存溢出

  • 栈溢出

    首先要知道栈中一般会存放哪些变量:函数形参、函数返回值、局部变量

    • 函数递归调用过深:

      由于函数的形参、返回值都是分配在栈上的,因此每次递归调用都会在栈上分配一定的空间,当递归层数过深,栈空间将被耗尽,导致栈溢出

    • 局部变量声明不合理:

      栈的空间是有限的,当声明了过大的局部变量,则会占用大量栈空间,甚至导致栈溢出

    • 其它

      每一个线程都会分配一定的栈空间,若线程创建过多(如不小心循环创建),也可能导致栈溢出

  • 解决方案

    • 堆溢出:动态申请的内存要及时释放

    • 栈溢出:局部变量声明、数据结构的使用要合理

  • 排查

    • 代码审查、单元测试、使用内存检查工具

野指针

  • 定义

    指向已释放或未分配的内存空间的指针

  • 产生原因

    • 使用已释放的指针
    • 未初始化
    • 指向超出内存空间的范围
  • 后果

    导致未定义的行为,严重甚至会造成内存数据被破坏或程序崩溃

  • 解决方案

    • 确保初始化
    • 不再使用时将其置为NULL/nullptr

智能指针我理解就是在对象生命周期自动管理内存的分配和释放,所以原理和上述各方案是关联的

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 宏景eHR /ajax/ajaxService SQL注入漏洞复现
  • 【时时三省】unity test 测试框架 使用 code blocks 移植
  • 如何解决C#字典的线程安全问题
  • 40.组合综合Ⅱ
  • 【JavaEE精炼宝库】 网络编程套接字——UDP业务逻辑 | TCP流套接字编程及业务逻辑实现
  • 沉浸式企业VR展厅,重塑企业形象展示方式!
  • 程序员进阶架构知识体系、开发运维工具使用、Java体系知识扩展、前后端分离流程详解、设计模式开发实例汇总专栏分享
  • ComfyUI: 报EP Error错误(onnxruntime)
  • nginx的反向代理及负载均衡
  • 软件测试基础1--功能测试
  • EasyAR_稠密空间图
  • RIP综合练习
  • 在快速消费品业务中利用知识管理的指南
  • 文件存储服务系统(File Storage Service System)-02-SFTP 协议介绍
  • 【从零开始一步步学习VSOA开发】开发环境搭建
  • [LeetCode] Wiggle Sort
  • Android 控件背景颜色处理
  • Computed property XXX was assigned to but it has no setter
  • Just for fun——迅速写完快速排序
  • node-glob通配符
  • PhantomJS 安装
  • php中curl和soap方式请求服务超时问题
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • storm drpc实例
  • 阿里云前端周刊 - 第 26 期
  • 大快搜索数据爬虫技术实例安装教学篇
  • 高度不固定时垂直居中
  • 关于 Cirru Editor 存储格式
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 记一次和乔布斯合作最难忘的经历
  • 试着探索高并发下的系统架构面貌
  • 携程小程序初体验
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ionic异常记录
  • linux 淘宝开源监控工具tsar
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)(1.13) SiK无线电高级配置(五)
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (七)c52学习之旅-中断
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)C#调用WebService 基础
  • .bat批处理(一):@echo off
  • .NET 8.0 发布到 IIS
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET Micro Framework初体验(二)