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

时间:2011-02-16 05:20:01

标签: visual-c++ memory memory-leaks memory-management

内存泄漏究竟是什么

它将如何影响程序运行的系统?

5 个答案:

答案 0 :(得分:8)

当您的进程持续从操作系统分配内存,并且永远不会释放任何内存时,您最终将使用的内存超过计算机中的物理内存。此时,操作系统将首先更换为虚拟内存(降低性能),如果有任何操作,并且在某些时候,您的进程将达到操作系统无法再为其提供更多内存的程度,因为您已超出最大值可寻址空间量(32位操作系统上为4GB)。

这种情况基本上有两个原因:你已经分配了内存并且你已经丢失了它的指针(它已经无法访问你的程序),所以你不能再释放它了。这就是大多数人所说的内存泄漏。或者,您可能只是分配内存而永远不会释放它,因为您的程序是懒惰的。这不是泄漏,但最终,你遇到的问题是相同的。

答案 1 :(得分:3)

内存泄漏是指您的代码分配内存然后丢失内存,包括以后释放内存的能力。

例如,在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的数量。

答案 2 :(得分:1)

你的程序最终会崩溃。如果它没有自行崩溃,它将帮助其他程序因内存不足而崩溃。

答案 3 :(得分:1)

当您泄漏内存时,这意味着您正在动态创建对象但不会破坏它们。如果泄漏严重,您的程序最终将耗尽地址空间,未来的分配尝试将失败(可能导致您的应用程序终止或崩溃,因为如果您泄漏内存,您可能没有处理内存不足的情况如果它试图分配太多内存,操作系统将暂停你的进程。

此外,您必须记住,在C ++中,许多对象都有析构函数:当您未能销毁动态分配的对象时,将不会调用其析构函数。

答案 4 :(得分:1)

内存泄漏是程序分配动态内存然后丢失指向该内存的所有指针的情况,因此它既不能解决也不能释放它。内存仍然标记为已分配,因此当程序请求更多内存时,它将永远不会被返回。

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