什么是'内存泄漏'?这是性能问题还是安全问题?

时间:2013-12-23 13:04:23

标签: javascript memory memory-leaks

我正在通过这个link进行内存泄漏,但由于幻灯片我无法理解。可以告诉我什么是内存泄漏示例?这是性能问题还是安全问题?

3 个答案:

答案 0 :(得分:3)

经常内存泄漏会导致崩溃。如果您在尝试之前从未使用C编码。您将学到很多关于内存分配和访问的知识。刚刚开始时的欢乐时光。

在C语言中,与某些语言相比,您必须告诉计算机何时需要内存和多少。然后,当你不想要记忆时,你必须告诉它。所以,如果你想要一个8个字符的数组,那么你必须说你想要那些8个字符的内存。如果您忘记告诉计算机您不再需要内存,那么它将不会被释放。这是内存泄漏。如果你这么做很多,那么你可能会耗尽内存。

int main()
{
    int strLength = 10;
    // Lets ask for some memory for a string
    char *str = (char *)malloc(sizeof(char));
    for (int i=0; i<strLength; i++)
    {
         str[i] = 'a' + i;
    }
    str[strLength-1] = 0;
    // This should print "abcdefghi"
    printf(str);
    // We should run this to free memory: free(str);
    return 0;
}

上面看起来并不那么糟糕,但如果你在循环中这样做,那么你可以快速开始使用大量内存。

至于安全性:如果泄漏类似于防火墙,并且可以使用泄漏导致泄漏,那么这是一个安全问题。

答案 1 :(得分:1)

正如wikipedia webpage所说,

  

在计算机科学中,计算机程序发生内存泄漏   错误地管理内存分配。1面向对象   编程时,存储对象时可能发生内存泄漏   内存但运行代码无法访问。2内存泄漏   有类似于许多其他问题的症状(见下文)和   通常只能由有权访问的程序员诊断   程序

stackoverflow中的memory-leaks tag显示

  

当程序无法释放已分配但不再使用的内存时,会发生内存泄漏。

根据您的问题,如果是安全问题或性能问题,我会说两者,因为一旦发生内存泄漏,在大多数情况下程序应该无法继续运行,并被强制执行停。

根据memory-leaks tag节目,程序

中发生内存泄漏
  

可能很快导致系统无法为其他程序(甚至是其自身)分配内存,从而导致性能不佳和意外故障。在一些不太现代的环境中,内存泄漏可能会意外地崩溃系统,从而导致其他问题。

答案 2 :(得分:1)

在较旧的软件中,所有内容都是固定大小的,如字符串缓冲区等。内存泄漏很少,但能力有限。

现在,大多数现代软件都在分配中管理内存。您为字符串或文件或其他任务请求一块或一块内存,当您完成它时,您将其返回(通常是给操作系统或任何打电话给你的人)。例如,假设您需要吸入要处理的文件,您或您的函数会计算出需要多少空间,并且请求一个大块的块。或者,如果你只是想做一些简单的事情,比如通过将两个其他字符串连接在一起来构建一个字符串,比如$ new ='old'+'er',这就为$ new字符串分配了一小段内存。

所以回到完成它后回忆内存的问题。例如,较新版本的php具有所谓的引用计数器,允许软件回馈内存,即使您忘记了。

但是我在一些(现在大多数是现在的)软件中看到的是,如果遇到错误,并且完成了从错误中恢复的陷阱,则代码中可能会出现错误,导致忘记返回你通常会回馈的内存,这会产生所谓的内存泄漏或分配的内存,但不能重复使用,因此在重新发布泄漏时逐渐建立大小。

在较低级别的代码中,此泄漏可能导致程序通过导致崩溃来踩踏自己或其他人。

内存泄漏可能会在奇怪的时候导致奇怪的错误,这些错误似乎与错误实际发生时无关。就像你可能有一个程序运行一周,每天都做同样的事情,然后突然失败了。

因此,如果稳健性是性能,则内存泄漏是性能问题。如果它可能导致软件崩溃,则可能是安全问题。几年前,我有一个朋友闯入主要的大学服务器,因为他发现了一个会崩溃并提供机会之窗的程序。