这会泄漏记忆:
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永远不会被删除。
答案 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.