c++内存泄漏检查
C++ Memory Leak Check
这会泄漏内存吗?
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.
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- 使用 valgrind 检查我的链表暗示中的内存泄漏,让我"肯定丢失:1 个块中有 40 个字节"
- 如何使用 Malloc 调试来检查本机内存泄漏?
- 瓦尔格林德 + --泄漏检查 -> 不泄漏摘要
- 检查内存泄漏问题
- 检查内存泄漏
- 如何检查火息插件中的内存泄漏
- C++内存泄漏检查中的瓦尔格林德错误
- 非常简单的程序通过了VS2010 c++内存泄漏检查器,但在销毁所有对象后仍然在程序端使用更多内存
- 如何使 cuda-memcheck 在出现泄漏检查错误时返回非零
- 检查内存泄漏
- 有没有办法检查此内存泄漏
- 使用boost日志,Valgrind检查内存泄漏
- 如何在运行时使用Valgrind检查实际内存泄漏
- 内存泄漏:检查块类型
- 什么调试器可以检查c++代码是否存在内存泄漏
- 实时应用程序中的内存泄漏检查
- c++内存泄漏检查
- 免费应用程序检查内存泄漏在Windows x64
- 如何检查大型c++ Linux应用程序中的内存泄漏