前言

所谓的内存泄漏就是用动态变量机制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. 北京智源人工智能研究院启动“智源学者计划”,与旷视发布首个智源联合实验室
  2. Google设想将《黑镜》情节变为现实,但要你的隐私作交换
  3. 【阿里云课程】从零开始1小时快速掌握Pytorch核心功能,完成完整的项目实践...
  4. SAP 年结(转载)
  5. PTA 06-图2 Saving James Bond - Easy Version (25分)
  6. 一个项目涉及到的50个Sql语句
  7. LeetCode62 Unique Paths
  8. 蓝鳍鱼乐岿彦演讲实录:VR面临的机遇和挑战
  9. 【Linux】Linux备份与恢复——dump和restore命令
  10. Eclipse主题插件之Darkest Dark Theme with DevStyle
  11. 使用 ngrok 进行内网穿透
  12. My summery
  13. RouterOS 重置密码
  14. Mybatis-There is no getter for property named 'tj' in 'class
  15. 20+主流跨境电商平台API地址大全
  16. R 下载GEO数据总是超时
  17. hp linux 禁用u盘启动项,BIOS关闭Secure Boot(安全启动)方法大全(联想,华硕,DELL,HP等品牌)...
  18. “盘古”走向产业山峦,打开了一串AI落地的新脑洞
  19. vue网易云歌单案例
  20. awk(二)awk程序元素

热门文章

  1. 用express搭建网站
  2. 原创:2016.4.25-2016.5.1 C# informal essay and tittle_tattle
  3. php dat文件,window_Win7系统怎么打开Dat文件 Win7系统打开Dat文件的方法,  在电脑中的Dat文件是很常 - phpStudy...
  4. php有ssm框架吗,SSM框架-企业门户网站-1-工程构建
  5. blockquote 和 q 标签 css样式
  6. hdu 2604 Queuing AC自动机构造递推式-矩阵-结果
  7. CCNP精粹系列之十七--路由映射实战,博主推荐
  8. freebsd 6.2 安装配置笔记[转]
  9. 阿里云轻量服务器 外网卡_阿里云服务器购买流程及注意事项
  10. socket 函数 setsockopt()用法