平时的编程练习不会涉及到特大的数据,所以,不会注意到内存泄漏导致的危害。一般来说,当程序需要较长时间的运行时,内存泄漏的危害会慢慢的体现出来。泄漏的内存会越堆积越多,最终,编译器无法为程序分配新内存,导致内存管理程序一直占用CPU,所以电脑或者服务器会变得很卡。
如何发现内存泄漏
一般来说,程序运行过程中,如果电脑变的很卡。这时,就应该考虑是内存泄漏导致的。当然,如果电脑本身内存较小,CPU主频很低,即使不发生内存泄漏,当内存使用量达到一定程度时,也会变得很卡。
VC6.0本身就带有内存检测的工具,即调试器和CRT调试堆函数。因为内存泄漏主要是由于没有释放由malloc和new分配的堆内存导致的,这两个工具对堆内存进行检测。汇报相关的泄漏情况。
为了使用调试堆函数,必须在C或者C++代码中添加下面的宏定义和头文件:
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
引入这个宏定义和头文件后,在想检查内存泄漏情况的地方使用语句:
_CrtDumpMemoryLeaks();
在VC++调试会话(按F5运行调试),输出窗口的Debug页会看到与其的内存泄漏情况。不过使用CRT调试堆函数不能够得到内存泄漏的具体的行,会通知内存泄漏的大小。
常见的内存泄漏情况
常见的内存泄漏主要是由于使用malloc函数和new之后,没有使用相应的free函数和delete导致的。其实这种情况很容易解决,只要我们保证每个malloc和new之后就有一个free和delete来释放相应的内存就可以。
有一个地方需要注意,那就是二维数组的释放。一般来说,二维数组的声明如下:
int **a = new int[5][4];或者int (*a) = malloc(sizeof(int) * 5 * 4);
前一个数组释放时需要这样:
for(int i = 0; i < 5; i++)
{
delete []a[i];
}
后一个直接free(a)就可以。