【发布时间】:2020-02-10 16:42:47
【问题描述】:
我试图弄清楚为什么 Valgrind 不发出任何警告,即使在下面的代码中,malloc 之后没有 free:
#include "stdlib.h"
#include "string.h"
char* ptr;
int main (int argc, char *argv[]) {
ptr = static_cast<char*>(malloc(5 * sizeof(char)));
strcpy(ptr, "test");
}
是否有某种我不知道的“自动免费”或者我错过了什么?
谢谢。
【问题讨论】:
-
只是猜测,但是如果您分配内存并将其存储在全局中,除非您将指针替换为其他内容,否则它永远不会泄漏,否则您始终可以访问它。 valgrind 能否检测到后一种情况是另一回事。
-
可能是这种情况。我认为到达
main的末尾将是将该内存标记为丢失的一个很好的理由,即使此时执行已经结束。 -
Valgrind 肯定会知道这个内存并将其报告为
still reachable。您的程序没有内存泄漏,因为它没有丢失对已分配内存的最后引用。main退出后,程序还没有完全终止。在 C 中,库中有atexit处理程序可以调用和清理,C++有全局析构函数。