什么是内存泄漏?
它会对程序所运行的系统产生什么影响?
什么是内存泄漏?
它会对程序所运行的系统产生什么影响?
当您的进程持续从操作系统中分配内存,且从未释放其中任何一部分时,最终您将使用比机器物理内存更多的内存。此时,如果操作系统有虚拟内存,它将首先进行交换(性能下降),并且在某个点上,您的进程将达到一个无法再授予更多内存的点,因为您已经超过了可寻址空间的最大量(32位操作系统上为4GB)。
基本上有两个原因会导致这种情况发生:一是您已经分配了内存,但却失去了对它的指针(它已经对您的程序不可达),因此您不能再释放它。这就是大多数人所说的内存泄漏。或者,您可能只是在分配内存而从未释放它,因为您的程序懒惰。这不是很像泄漏,但到最后,您遇到的问题都是相同的。
内存泄漏是指你的代码分配了内存,但随后失去了跟踪它的能力,包括以后释放它的能力。
例如,在 C 语言中,可以通过以下简单的序列来实现:
void *pointer = malloc (2718); // Alloc, store address in pointer.
pointer = malloc (31415); // And again.
free (pointer); // Only frees the second block.
原始的内存块仍然被分配,但是因为pointer
不再指向它,你无法释放它。
单独这个序列并不太糟糕(嗯,它确实很糟糕,但影响可能不大)。通常情况下,当你重复执行它时,问题就会出现。例如在循环中或反复调用的函数中:
static char firstDigit (int val) {
char *buff = malloc (100); // Allocates.
if (val < 0)
val = -val;
sprintf (buff, "%d", val);
return buff[0]; // But never frees.
}
你的程序最终会崩溃。如果它自己不崩溃,由于内存不足,它将帮助其他程序崩溃。
内存泄漏是指程序分配动态内存后失去了对该内存的所有指针,因此既无法寻址也无法释放。内存仍然被标记为已分配,因此当程序请求更多内存时,它永远不会被返回。
程序将以某种速度耗尽有限的资源。根据内存和交换文件的数量,这可能会导致程序最终出现“无法分配内存”的指示或操作系统耗尽物理内存和交换文件,从而使任何程序都出现“无法分配内存”的指示。后者可能会对某些操作系统产生严重后果 - 我们有时会看到Windows XP在一个程序的极端内存消耗耗尽所有内存后,关键服务严重故障而完全崩溃。如果发生这种情况,解决问题的唯一方法是重新启动系统。