如果内存泄漏会发生什么?

9

什么是内存泄漏

它会对程序所运行的系统产生什么影响?


避免内存泄漏要比诊断现有泄漏至少容易一个数量级。 - seand
5个回答

10

当您的进程持续从操作系统中分配内存,且从未释放其中任何一部分时,最终您将使用比机器物理内存更多的内存。此时,如果操作系统有虚拟内存,它将首先进行交换(性能下降),并且在某个点上,您的进程将达到一个无法再授予更多内存的点,因为您已经超过了可寻址空间的最大量(32位操作系统上为4GB)。

基本上有两个原因会导致这种情况发生:一是您已经分配了内存,但却失去了对它的指针(它已经对您的程序不可达),因此您不能再释放它。这就是大多数人所说的内存泄漏。或者,您可能只是在分配内存而从未释放它,因为您的程序懒惰。这不是很像泄漏,但到最后,您遇到的问题都是相同的。


4

内存泄漏是指你的代码分配了内存,但随后失去了跟踪它的能力,包括以后释放它的能力。

例如,在 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这样的优秀操作系统将限制单个进程可以使用的资源,这将最小化对其他进程的影响。由于现代环境将虚拟内存与物理内存分离,因此唯一真正可以从一个进程传递到另一个进程的影响是,如果一个进程试图始终在物理内存中保留其所有虚拟内存,这将减少其他进程对该物理内存的分配。
但是,即使单个进程泄漏了几千兆字节的内存,内存本身也不会被进程使用(泄漏的关键在于进程已失去对内存的访问)。而且,由于它没有被使用,操作系统几乎肯定会将其换出到磁盘,并且永远不需要再次将其带回RAM。
当然,它会使用交换空间,这可能会影响其他进程,但磁盘的数量远远超过物理RAM的数量。

1

你的程序最终会崩溃。如果它自己不崩溃,由于内存不足,它将帮助其他程序崩溃。


1
当你泄露内存时,意味着你正在动态创建对象,但是没有销毁它们。如果泄漏足够严重,你的程序最终将耗尽地址空间,未来的分配尝试将失败(很可能导致你的应用程序终止或崩溃,因为如果你正在泄漏内存,那么你可能也不能很好地处理内存不足的情况),或者如果进程尝试分配过多的内存,操作系统将停止该进程。
此外,你必须记住,在C++中,许多对象都有析构函数:如果你未能销毁动态分配的对象,其析构函数将不会被调用。

1

内存泄漏是指程序分配动态内存后失去了对该内存的所有指针,因此既无法寻址也无法释放。内存仍然被标记为已分配,因此当程序请求更多内存时,它永远不会被返回。

程序将以某种速度耗尽有限的资源。根据内存和交换文件的数量,这可能会导致程序最终出现“无法分配内存”的指示或操作系统耗尽物理内存和交换文件,从而使任何程序都出现“无法分配内存”的指示。后者可能会对某些操作系统产生严重后果 - 我们有时会看到Windows XP在一个程序的极端内存消耗耗尽所有内存后,关键服务严重故障而完全崩溃。如果发生这种情况,解决问题的唯一方法是重新启动系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接