参考:内存泄漏、内存溢出、段错误、堆溢出、栈溢出
作者:焦木白
发布时间:2019-10-22
网址:https://blog.csdn.net/jiaomubai/article/details/102680705?spm=1001.2014.3001.5501

目录

  • 段错误
  • 内存泄漏
  • 内存溢出
  • 栈溢出
  • 堆溢出

段错误

什么时候会发生段错误?

段错误通常发生在访问非法内存地址的时候,即使用了野指针(指向一个已删除的对象或者未申请访问受限内存区域的指针)或这试图修改字符串常量的内容。

内存泄漏

内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理意义上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

内存泄漏的分类:

(1)堆内存泄漏(heap leak):堆内存指的是程序在运行中根据通过malloc/new等从堆中分配的一块内存,使用完成后必须通过调用相对应的free/delete释放掉。如果程序设计的错误导致这部分内存没有被释放掉,那么此后这块内存将不会被使用,就会产生堆内存泄漏。

(2)系统资源泄漏(resource leak):主要指程序使用系统分配的资源比如bitmap、handle、socket等没有使用相应的函数释放掉,导致系统资源的浪费,严重时可导致系统性能降低,运行不稳定。

(3)没有将基类的析构函数定义为虚函数。当基类指针指向派生类的对象时,如果基类的析构函数不是虚函数,那么子类的析构函数将不会被调用,子类的资源没有被正确释放掉,因此造成内存泄漏。

如何判断内存泄漏?

内存泄漏通常是由于调用了malloc/new等申请内存的操作,但是缺少了对应的free/delete操作。为了判断内存泄漏,我们可以使用linux下的内存泄漏检查工具来判断内存是否泄漏,除此之外,我们可以在写代码时添加内存申请和释放的统计功能,来统计当前申请和释放的内存是否一致,从而来判断内存是否泄漏。

内存溢出

内存溢出指程序在申请内存时,没有足够的内存供申请者使用。内存溢出就是程序员要申请的内存空间超过了系统实际能够分配给你的空间,此时系统相当于没法满足程序员的需求,就会报内存溢出的错误。

内存溢出原因:

(1)内存中加载的数据量过于庞大,如一次性从数据库取出过多数据。

(2)集合类中有对对象的引用,使用后未清空,使得不能回收。

(3)代码中存在死循环或循环产生过多重复的对象实体。

(4)使用的第三方软件中的bug

(5)启动参数内存值设定的过小

栈溢出

一般通俗来说,栈溢出就是由于递归或循环嵌套层次太多造成的。在平时的编程中,造成栈溢出的现象主要有以下几种:

(1)局部数组过大。当函数内部的数组过大时,有可能导致栈溢出。

(2)递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致栈溢出。例如,在解决斐波那契数列时,采用递归法求第1000项的斐波那契数时,往往会造成栈溢出。

(3)指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。

针对以上现象的解决办法有:一是增大栈空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。

堆溢出

通常来说,导致堆溢出的操作是不断的new 一个对象,一直创建新的对象,但是不销毁。

段错误、内存泄漏、内存溢出、堆溢出、栈溢出相关推荐

  1. 45.JVM调优策略、常见问题:内存泄漏(年老代堆空间被占满、持久代被占满、堆栈溢出、线程堆栈满、系统内存被占满)优化方法:优化目标、优化GC步骤、优化总结;案例分析(公司系统参数、网上给的配置参数)

    45.JVM调优策略 45.1.常见问题 45.1.1.内存泄漏 45.1.1.1.年老代堆空间被占满 45.1.1.2.持久代被占满 45.1.1.3.堆栈溢出 45.1.1.4.线程堆栈满 45. ...

  2. 段错误linux 内存不够,c - 为什么我的程序在linux-gcc而不是mingw-gcc上出现段错误? - 堆栈内存溢出...

    我已经用C语言编写了一个程序.问题是,当我在Linux / Unix环境中编译该程序时,出现了段错误. 但是,当我在Windows中使用minGW对其进行编译时,它可以正常工作. 基本上在程序中我有一 ...

  3. 内存泄漏 内存溢出 踩内存 malloc底层实现原理

    本文主要对内存泄漏.内存溢出.内存踩踏[踩内存]以及malloc的底层实现原理进行了总结.话不多说,直接往下看: 参考文章: 内存泄漏与内存溢出: https://blog.csdn.net/ruir ...

  4. 内存泄漏——内存溢出区别

    内存溢出和内存泄漏的区别.产生原因以及解决方案 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但 ...

  5. linux内存不足+段错误,Linux系统内存错误产生的原因及调试方法(段错误|core dumped)[转]...

    产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来 ...

  6. 什么是堆,栈,内存泄漏和内存溢出?

    heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 一.预备知识-程序的内存分配 一个由 ...

  7. 堆,栈,内存泄露,内存溢出介绍

    简单的可以理解为: heap(堆):是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack(栈):是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 一. ...

  8. 内存泄漏 和 内存溢出

    在计算机科学中,内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存 ...

  9. 移动端测试=== 两个概念 内存泄漏 和 内存溢出 【转】

    关于内存在一块其实我并不是很想拿出来说,一般情况下内存这一块都是可优化的,可以通过硬件资源或者调整一些系统或者应用系统的参数配置来进行优化. 很多同僚问到了"内存泄漏"和" ...

最新文章

  1. Linux数据报文接收发送总结3
  2. Python语言学习之文件格式后缀那些事:python和常见各种文件格式后缀介绍、使用方法之详细攻略
  3. codeforces 1060 A
  4. 过去3个多月的1200个小时里,我收获了什么?| 2021年年中总结
  5. leetcode 109 --- 有序链表变成二叉搜索树
  6. 第三:项目框架设计介绍
  7. HttpRequest 和HttpWebRequest的区别
  8. Java模拟http上传文件请求(HttpURLConnection,HttpClient4.4,RestTemplate)
  9. 电路布线问题(迷宫问题)
  10. Cocos Creator方向与角度转换
  11. 无线路由器服务器连接线,有线路由器接无线路由器怎么设置
  12. 蓉叶云库——简单介绍seo技术
  13. Pytorch学习笔记——Momentum
  14. HCTF writeup(web)
  15. Kinect安装与使用(一)
  16. java提示结果集已耗尽,java 结果集已耗尽
  17. docker容器中配置文件修改错误,导致容器无法启动
  18. 汇编--call和ret指令
  19. centos7升级Apache2.4.6到2.4.54
  20. 一些我平常用到的软件

热门文章

  1. 【教程】如何在标签打印工具TFORMer Designer中自定义布局?
  2. Docker中未指定挂载点容器间volume卷的数据共享
  3. 关于二维码分块上色(彩色二维码)的算法研究
  4. Flume sink=avro rpc connection error
  5. common-collections中Java反序列化漏洞导致的RCE原理分析
  6. django 修改日期
  7. arm-linux-gcc:Command not found的问题
  8. 互斥锁pthread_mutex_t的使用
  9. kali装电脑_Kali Linux可以安装到平板电脑吗?
  10. vs2019 更新安装错误_本月Windows 10累积更新再出BUG:安装时跳出错误代码