c++内存泄漏检查

C++ Memory Leak Check

本文关键字:检查 泄漏 内存 c++      更新时间:2023-10-16

这会泄漏内存吗?

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] = '';
    return (std::string) psBuffer;
} // GetStringFromUser()

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

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

3.2.5自动变大小存储

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

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

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

然而,这是不安全的:关于alloca可能出现的问题的讨论,请参阅这个问题。

是的,它会泄漏。需要调用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.