内存泄漏及内存溢出
来源:互联网 发布:安卓制作软件 编辑:程序博客网 时间:2024/05/29 12:03
1. 什么是内存泄漏(memory leak)
指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
2. 对于C和C++这种没有Garbage Collection 的语言来讲,我们主要关注两种类型的内存泄漏:
堆内存泄漏(Heap leak)。对内存指的是程序运行中根据需要分配通过malloc、realloc、new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak.。
系统资源泄露(Resource Leak).主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。
3. 如何解决内存泄露?
内存泄露的问题其困难在于1.编译器不能发现这些问题。2.运行时才能捕获到这些错误,这些错误没有明显的症状,时隐时现。3.对于手机等终端开发用户来说,尤为困难。下面从三个方面来解决内存泄露:
第一,良好的编码习惯,尽量在涉及内存的程序段,检测出内存泄露。当程式稳定之后,在来检测内存泄露时,无疑增加了排除的困难和复杂度。使用了内存分配的函数,要记得要使用其想用的函数释放掉,一旦使用完毕。
Heap memory:malloc\realloc ------ freenew \new[] ---------- delete \delete[]GlobalAlloc------------GlobalFree 要特别注意数组对象的内存泄漏MyPointEX *pointArray =new MyPointEX [100];其删除形式为:delete []pointArray
Resource Leak :对于系统资源使用之前要仔细看起使用方法,防止错误使用或者忘记释放掉系统资源。
4. 由内存泄露引出内存溢出话题:
所谓内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是会产生内存溢出的问题。
常见的溢出主要有:
内存分配未成功,却使用了它。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p 是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc 或new 来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。
内存分配虽然成功,但是尚未初始化就引用它。内存分配成功并且已经初始化,但操作越过了内存的边界。例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for 循环语句中,循环次数很容易搞错,导致数组操作越界。
使用free 或delete 释放了内存后,没有将指针设置为NULL。导致产生“野指针”。程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。
不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
- 内存泄漏及内存溢出
- 内存溢出 内存泄漏
- 内存溢出 内存泄漏
- 内存泄漏、内存溢出
- 内存溢出&内存泄漏
- 内存溢出和泄漏
- 内存泄漏和溢出
- 内存泄漏和溢出
- 内存溢出与泄漏
- 内存泄漏、越界、溢出
- 内存泄漏和内存溢出
- 内存泄漏 与 内存溢出
- 内存泄漏和内存溢出
- 内存溢出和内存泄漏
- 内存泄漏与内存溢出
- 内存溢出和内存泄漏
- 内存溢出和内存泄漏
- 内存溢出与内存泄漏
- Divide and Conquer -- Leetcode problem241:Different Ways to Add Parentheses
- MD5处理的几种方式
- HTML学习心得(一)
- 搜狗输入法Linux版配置文件详解
- caffe训练模型后,使用模型测试的分类结果全部都是相同的
- 内存泄漏及内存溢出
- inflate.inflate(R.layout.xxxx,null); 报空指针异常
- 多层nginx代理tomcat获取客户端真实ip
- 计算机核心期刊排名及投稿信息
- Java总结篇系列:类型转换/造型
- 使用SQLAlchemy
- 直接插入排序 java
- bzoj1878: [SDOI2009]HH的项链
- 进入windows 服务