内存泄漏(memory leak)和内存溢出

摘要:
内存泄漏不是内部内存的物理消失,而是由于设计错误,应用程序分配内存段后,对内存段失去控制,导致内存浪费。内存是指在程序运行期间,malloc、reallocnew等根据需要从堆中分配的一块内存,然后在完成后通过调用相应的free或delete来删除。内存分配成功并初始化,但操作超出了内存边界。使用free或delete释放内存后,指针不会设置为NULL。

1. 什么是内存泄漏(memory leak)?

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


2. 两种类型的内存泄漏:


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


系统资源泄露(Resource Leak).主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。
在linux中 两个文件描述符指向一个file。必须关闭两次,否则会出现内存泄露
还有在linux中,open()以后一定要加上close()
eg:closehandle() closesocket()

内存泄露引出内存溢出话题:
所谓内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是会产生内存溢出的问题。

常见的溢出主要有:
内存分配未成功,却使用了它。
常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p 是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc 或new 来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。

内存分配虽然成功,但是尚未初始化就引用它。
内存分配成功并且已经初始化,但操作越过了内存的边界。
例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for 循环语句中,循环次数很容易搞错,导致数组操作越界。

使用free 或delete 释放了内存后,没有将指针设置为NULL。导致产生“野指针”。

免责声明:文章转载自《内存泄漏(memory leak)和内存溢出》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ios 关于如何在app里面设置版本更新功能自媒体新人常见问题汇总-千氪下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MFC查内存泄漏方法

此方法仅使用于固定内存地址的泄漏问题(如果地址不固定,需要多次尝试,会比较难找,或者是主动分析才能找得到) 工作中MFC工程调试遇到关闭工程时,输出视图出现内存泄漏,如下图所示: 在theApp.InitInstance()中加上如下接口:_CrtSetBreakAlloc(34719); // 测试内存泄漏,参数是上图中泄漏的地址 如下图所示  再次...

Tomcat中JVM内存溢出及合理配置

  Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍。 一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有...

nginx和fpm的进程数配置和502,504错误

 502 和 php-fpm.conf 1.php-cgi进程数不够用。php执行时间长,导致没有空闲进程处理新请求。 2.php-cgi进程死掉。php-fpm超时时间短,当前进程执行超时关闭连接。 实例: 1.request_terminate_timeout引起的资源问题 request_terminate_timeout默认值为 0 秒,也就是说,...

由浅入深TheradLocal

线程并发:在多线程并发的场景下 传递数据:我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量 线程隔离:每个线程的变量都是独立的,不会相互影响 常用方法 方法声明 描述 ThreadLocal() 创建ThreadLocal对象 public void set(T value) 设置当前线程绑定的局部变量 public...

JNI内存使用问题(转载)

程序员在使用 JNI 时应当认识到 JNI 编程中如下的几点弊端,扬长避短,才可以写出更加完善、高性能的代码: 从 Java 环境到 native code 的上下文切换耗时、低效。 JNI 编程,如果操作不当,可能引起 Java 虚拟机的崩溃。 JNI 编程,如果操作不当,可能引起内存泄漏。 1.jni内存泄露从两个方面来说 1)JVM中的java...

使用Jconsole监控weblogic的配置方法

在项目中发现full gc非常频繁。达到了每分钟13次。我怀疑可能会有内存泄露。于是在晚上找了内存泄露的资料。 内存长期占用并导致系统不稳定一般有两种可能: 1. 对象被大量创建而且被缓存,在旧的对象释放前又有大量新的对象被创建使得内存长期高位占用。 表现为:内存不断被消耗、在高位时也很难回归到低位,有大量的对象在不断的创建,经过很长时间后又被回收。例如...