内存泄漏
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
导致内存泄漏的原因大多分为以下几个情况
1.未初始化的内存
char *p = malloc ( 10 );
p
已被分配了 10 个字节。这 10 个字节可能包含垃圾数据 某个代码段尝试访问它,则可能会获得垃圾值。
您的程序可能具有不可预测的行为。p
可能具有您的程序从未曾预料到的值。
良好的实践是始终结合使用 memset
和 malloc
,或者使用 calloc
。
char *p = malloc (10); memset(p,’\0’,10);
现在,即使同一个代码段尝试在对 p
赋值前访问它,该代码段也能正确处理 Null
值(在理想情况下应具有的值),然后将具有正确的行为。
2.内存覆盖
3.读取越界
内存读取越界 (overread) 是指所读取的字节数多于它们应有的字节数。
4.未及时释放动态申请的堆内存
#include <stdlib.h> #include <iostream> using namespace std; void GetMemory(char *p, int num) { p = (char*)malloc(sizeof(char) * num);//使用new也能够检测出来 } int main(int argc,char** argv) { char *str = NULL; GetMemory(str, 100); cout<<"Memory leak test!"<<endl; //如果main中存在while循环调用GetMemory //那么问题将变得很严重 //while(1){GetMemory(...);} return 0; }
总结良好的实践是:
- 始终结合使用memset和 malloc,或始终使用calloc。
- 每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。
- 在对指针赋值前,要确保没有内存位置会变为孤立的。
- 每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应首先遍历子内存位置并从那里开始释放,然后再遍历回父节点。
- 始终正确处理返回动态分配的内存引用的函数返回值。
- 每个malloc 都要有一个对应的 free。
- 确保您不是在访问空指针。
相关推荐
C内存管理内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍...本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题
详细的内存问题,经典!内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++...本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。
从与C/C 内存泄漏对比的角度分析了Java内存泄漏问题,详细介绍了Java内存泄漏的相关研究和工具,探讨了当前研究和工具中存在的不足并分析了其原因,总结了内存泄漏相关领域研究的发展趋势。
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的...本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。
从内存管理、内存泄漏、内存回收这三个方面来探讨C+ +内存管理问题。
本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。 内容预览: 1 内 存管理 1.1 C++内存管理详解 1.1.1 内存分配方式 1.1.1.1 分配方式简介 1.1.1.2 明确区分堆与栈 1.1.1.3 堆和栈究竟...
初学 objectice-C 的朋友都有一个困惑,总觉得对 objective-C 的内存管理 机制琢磨不透,程序经常内存泄漏或莫名其妙的崩溃。我在这里总结了自己对 o bjective-C 内存管理机制的研究成果和经验,写了这么一个由浅入深的...
此外,我们还将介绍如何使用动态内存分配函数来管理内存,以及如何防止内存泄漏和内存溢出等问题。 在掌握了现代C语言的核心特性之后,我们将进一步介绍如何使用C语言与宠物狗进行互动。我们将首先讲解如何读取宠物...
代码中可能依然隐含了安全、设计或是风格上的缺陷,从而导致程序运行时出现内存泄露、指针误用等现象,或导致程序代码不清晰、可读性差。为了有效查找这些缺陷,探讨了可定制缺陷规则的C 代码缺陷自动检测技术,介绍...
维护类问题(C类)-指设计、编码中出现的对软件系统的维护方便程度造成影响的问题,在系统中不起关键作用,但对系统后期维护造成不便或导致维护费用上升; 可测试性问题(D类)-指设计、编码中因考虑不周而导致...