前言

所谓的内存泄漏就是用动态变量机制new了一段内存空间,以后不再需要这个变量的时候没有delete它,或者在没有delete之前,指针又指向了另外一个地址,这样先前的空间就丢失了。内存泄漏最典型的情况就是在函数中申请了一段动态空间,在函数返回前就没有delete它,造成内存泄漏。

此外对new操作的失败检查也是一个良好的编程习惯,虽然一般很少遇到,但是这种内存分配的失败不是不会发生的,用assert宏可以很轻松的完成这个任务了。

  int *p = new int;assert(p != NULL);

 

 内存溢出(out of memory)
是指程序在申请内存时,没有足够的内存空间供其使用。

  内存泄漏(memory leak)
是指程序在申请内存后,无法释放已申请的内存空间,占用有用内存。

注:内存泄漏最终会导致内存溢出
简单理解,内存溢出就是要求分配的内存超出了系统所给的。内存泄漏是指向系统申请分配内存进行使用(new),但是用完后不归还(delete),导致占用有效内存。

内存泄漏可分为4类:

1.常发性内存泄漏

引起内存泄漏的代码会被很多次执行,每次执行的时候都会导致内存泄漏

2.偶发性内存泄漏

在某些特定的环境下执行引起内存泄漏的代码,才会引起内存泄漏

从以上两种内存泄漏的方式来看,测试环境和测试方法在程序生命周期的重要性是不可或缺的。

3.一次性内存泄漏

代码只会执行一次,但总有一块内存发生泄漏,多见于构造类的时候,析构函数没有释放内存。

4.隐式泄漏

程序运行过程中不断的分配内存,直到结束时才释放内存,但一般服务器程序会运行较长的时间,不及时释放也会导致内存耗尽以至于内存泄漏。

综上所述,一次性内存泄漏对用户的程序维护是没有什么实质性的伤害,但在实际生活中,我们还是尽可能要避免此类的事件发生。

内存越界
是指向系统申请一块内存后,使用时却超出申请范围。比如一些操作内存的函数:sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove。当造成内存泄漏的代码运行时,所带来的错误是无法避免的,通常会造成
1.破坏了堆中内存内存分配信息数据
2.破坏了程序其他对象的内存空间
3.破坏了空闲内存块
附:如果在之前你的程序运行一切正常,但因为你新增了几个类的成员变量或者修改了一部分代码(前提是保证你的这些修改是完全正确的)而导致程序发生错误,则因考虑是否是内存被破坏的原因了,重点排查内存是否越界。
缓冲区溢出(栈溢出)
程序为了临时存取数据的需要,一般会分配一些内存空间称为缓冲区。如果向缓冲区中写入缓冲区无法容纳的数据,机会造成缓冲区以外的存储单元被改写,称为缓冲区溢出。而栈溢出是缓冲区溢出的一种,原理也是相同的。分为上溢出和下溢出。其中,上溢出是指栈满而又向其增加新的数据,导致数据溢出;下溢出是指空栈而又进行删除操作等,导致空间溢出。

如何检查和分析内存泄漏?

因为内存泄漏是在堆内存中,所以对我们来说并不是可见的。通常我们可以借助MAT、LeakCanary等工具来检测应用程序是否存在内存泄漏。
1、MAT是一款强大的内存分析工具,功能繁多而复杂。
2、LeakCanary则是由Square开源的一款轻量级的第三方内存泄漏检测工具,当检测到程序中产生内存泄漏时,它将以最直观的方式告诉我们哪里产生了内存泄漏和导致谁泄漏了而不能被回收。

C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系相关推荐

  1. C++内存机制中内存泄露、内存溢出、内存越界和内存泄漏原因分析

    在用C++做底层驱动时,经常会遇到内存不足的警告,往往是因为内存出现溢出.泄露或者越界等原因. 内存溢出(out of memory) 是指程序在申请内存时,没有足够的内存空间供其使用. 内存泄漏(m ...

  2. java 数据保存内存_java中的各种数据类型在内存中存储的方式 一

    1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...

  3. java int integer内存_java中一个integer对象的内存占用是多少?可以通过java方法输出吗?...

    今天翻记录看到了自己15年3月份提的问题,现在已经18年6月份了: 去年线上项目出现内存瓶颈,原因是缓存的玩家角色数据过多,在长时间不停服的情况下,导致数据越来越膨胀,之前没有清除无用缓存的机制,并且 ...

  4. python线程执行完后释放内存_Python中的线程终止与内存释放

    但我注意到,内存并没有释放(gc.get_objects()不断增长).实际上,这些对象是列表.dict等,而不是文件.在 有没有办法手动释放资源? 代码:import ctypes def term ...

  5. c/c++内存机制(一)(原)

    一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: (1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效. (2)堆(Heap):由程 ...

  6. c语言输出11258循环,c/c++内存机制(一)(转)

    一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: (1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效. (2)堆(Heap):由程 ...

  7. 内存池组件以及根据nginx内存池源码设计实现简易内存池

    目录 造轮子内存池原因引入 大量的malloc/free小内存所带来的弊端 弊端 出现场景 大牛解决措施(nginx内存池) 内存池技术 啥叫作内存池技术 内存池技术为啥可以解决上文弊端 高并发内存池 ...

  8. Java中七个潜在的内存泄露风险,你知道几个?

    虽然Java程序员不用像C/C++程序员那样时刻关注内存的使用情况,JVM会帮我们处理好这些,但并不是说有了GC就可以高枕无忧,内存泄露相关的问题一般在测试的时候很难发现,一旦上线流量起来可能马上就是 ...

  9. C++中运行一个程序的内存分配情况及qt中的内存管理机制

    一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一 ...

最新文章

  1. 重磅|PPT讲解机器人产业发展现状与未来展望,重磅资料
  2. HDU 3501 Calculation 2
  3. java 访问线程_java线程简介(共享对数据的访问)
  4. 如何成为优秀的前端工程师
  5. 牛客小白月赛12 I 华华和月月逛公园 (tarjian 求桥)
  6. C语言用循环写出新年祝福语图案,非常漂亮的新年祝福!C语言实现漂亮的烟花效果...
  7. SharePoint 2013 List 备份使用
  8. 杭州python爬虫招聘_python爬取招聘网站(智联,拉钩,Boss直聘)
  9. SOAP、WSDL、 UDDI之间的关系
  10. c语言gga字符串校验和代码,NEMA-0183(GPGGA,GPRMC,GPGSA,GPGSV,GPVTG)详解,并附解析代码(C语言版)...
  11. 爱普生690k打印针测试软件_针式打印机断针测试软件_9针、24针打印机断针测试 V1.3 下载...
  12. 动力节点 mysql 郭鑫 34道经典的面试题
  13. XR,VR,AR虚拟服务器,虚拟演播室
  14. emacs常用操作笔记
  15. kubelet 压力驱逐 - The node had condition:[DiskPressure]
  16. c语言中什么随机存取,C语言中对文件的随机存取
  17. IOS-layoutSubviews方法的调用时机
  18. LOAM系列——ISCLOAM配置、编译、问题解决及VLP16测试效果(完结版)
  19. 卧槽!福昕阅读器可以免费PDF转换啦?
  20. 数据仓库:如何解决ODS数据零点漂移问题

热门文章

  1. java中ssm付款代码_基于Java+SSM的网上订餐系统、基于JavaWeb的网上订餐系统
  2. hdu4814 黄金进制转换
  3. ubuntu pcl 点云库使用
  4. TopCoder中插件的用法
  5. 基于系统的流量控制(Qos)
  6. 2440 6.0BSP 移植过程之显示驱动篇
  7. android 讲程序设为默认主屏幕_轻松搞定 PC 副屏,双屏幕更方便!
  8. unity太空射击源码_引擎入门 | 创建双杆射击游戏(入门 2)
  9. Golang 中 RSA 算法的使用
  10. Laravel的核心概念