C ++内存泄漏检查

时间:2014-03-24 15:16:10

标签: c++ memory-leaks

这会泄漏记忆:

std::string GetStringFromUser(std::string sPrompt, int nMaxBuffSize)
{
    int i, ch;
    char *psBuffer = (char *) _alloca(nMaxBuffSize);
    fprintf(stderr, "%s", sPrompt.c_str());
    fflush(stderr);
    for (i = 0; (i < nMaxBuffSize) && ((ch = getchar()) != EOF) && (ch != '\n'); i++)
    {
        psBuffer[i] = (char) ch;
    }
    psBuffer[i] = '\0';
    return (std::string) psBuffer;

} // GetStringFromUser()

由我的一个更好的人写的,但似乎psBuffer永远不会被删除。

3 个答案:

答案 0 :(得分:2)

不,此函数没有内存泄漏,使用alloca不会导致内存泄漏,因为它在堆栈上分配。来自http://www.gnu.org/software/libc/manual/html_mono/libc.html#Variable-Size-Automatic

  

3.2.5可变大小的自动存储

     

函数alloca支持一种半动态分配,其中动态分配块但自动释放。

     

使用alloca分配块是一个明确的操作;您可以根据需要分配任意数量的块,并在运行时计算大小。但是当你退出调用alloca的函数时,所有的块都被释放,就好像它们是在该函数中声明的自动变量一样。没有办法明确释放空间。

答案 1 :(得分:1)

它很丑但很好(我假设_alloca基本上是alloca)。

但这不安全:请参阅this question,了解alloca可能出现的问题。

答案 2 :(得分:-2)

是的,它泄漏了。您需要致电free(psBuffer)将其删除。它不是自动垃圾收集。

另外,我怀疑(std::string) psBuffer是否会奏效。 STL字符串和C样式字符串是两种不同的容器类型。 STL字符串使用C样式字符串作为内部容器,并将包含更多信息。所以C风格类型转换不起作用。

相反,您应该执行以下操作来替换原始return语句:

std::string ret(psBuffer); // <-- content of psBuffer will be copied into string ret.
free(psBuffer);            // <-- garbage collect.
return ret;                // <-- return the correct string.