C++ 为什么Valgrind在没有释放malloc';d记忆?

C++ 为什么Valgrind在没有释放malloc';d记忆?,c++,malloc,valgrind,free,C++,Malloc,Valgrind,Free,我试图弄明白为什么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"); } #包括“stdlib.h” #包括“

我试图弄明白为什么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");
}
#包括“stdlib.h”
#包括“string.h”
char*ptr;
int main(int argc,char*argv[]){
ptr=静态(malloc(5*sizeof(char));
strcpy(ptr,“测试”);
}
是否有某种我不知道的“自动免费”或者我遗漏了什么


谢谢

它确实报告了问题,但要查看问题,您需要使用
--泄漏检查=完整--显示泄漏种类=所有
选项运行Valgrind:

$ valgrind --leak-check=full --show-leak-kinds=all ./a.out
==317235== Memcheck, a memory error detector
==317235== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==317235== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==317235== Command: ./a.out
==317235== 
==317235== 
==317235== HEAP SUMMARY:
==317235==     in use at exit: 5 bytes in 1 blocks
==317235==   total heap usage: 2 allocs, 1 frees, 72,709 bytes allocated
==317235== 
==317235== 5 bytes in 1 blocks are still reachable in loss record 1 of 1
==317235==    at 0x483980B: malloc (vg_replace_malloc.c:309)
==317235==    by 0x40113E: main (1.cpp:7)
==317235== 
==317235== LEAK SUMMARY:
==317235==    definitely lost: 0 bytes in 0 blocks
==317235==    indirectly lost: 0 bytes in 0 blocks
==317235==      possibly lost: 0 bytes in 0 blocks
==317235==    still reachable: 5 bytes in 1 blocks
==317235==         suppressed: 0 bytes in 0 blocks
==317235== 
==317235== For lists of detected and suppressed errors, rerun with: -s
==317235== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
即使在没有任何选项的情况下运行Valgrind,您也可以在堆摘要部分看到问题:

==317235==     in use at exit: 5 bytes in 1 blocks

但是没有更多细节。

内存泄漏意味着丢失分配内存的指针值。一旦值丢失,就无法再释放内存

静态指针的生存期是整个进程执行的时间。因此指针值从未丢失,因为它总是被存储的,并且在程序的任何一点上都不会出现无法释放指针的情况

Valgrind将此类内存分类为:

“仍然可以到达”。这涵盖了上述案例1和案例2(适用于BBB区块)。找到指向块的起始指针或起始指针链。由于块仍然指向,程序员至少在原则上可以在程序退出之前释放它。“仍然可以到达”的块非常常见,可以说不是问题。因此,默认情况下,Memcheck不会单独报告这些块


有什么“自动免费”的吗


不是调用
free
,而是一旦程序停止,它就不存在了,它的分配也就不重要了。

只是猜测,但如果您分配内存并将其存储在全局中,它就永远不会泄漏,除非您用其他东西替换指针,否则您总是可以访问它。valgrind是否能发现后一种情况是另一回事,可能就是这样。我假设到达
的末尾是将该内存标记为丢失的一个很好的理由,即使此时执行已经结束。Valgrind肯定会知道该内存,并将其报告为
仍然可以访问
。您的程序没有内存泄漏,因为它没有丢失对已分配内存的最后一次引用。退出
main
后,程序尚未完全终止。在C中,库中有
atexit
处理程序可以调用和清理,并且
C++
有全局析构函数。谢谢,这对我也很有用。起初,我只尝试了
--leak check=full
,但这显然是不够的。我还注意到另一个警告:
==2937==72704字节在1个块中的丢失记录1==2937==At 0x483577F:malloc(in/usr/lib/x86_64-linux-gnu/valgrind/vgpreload\u memcheck-amd64-linux.so)[…一些跟踪…]==2937==0x40010C9:???(在/lib/x86_64-linux-gnu/ld-2.28.so中)
我假设这不是我的错,是吗?是的,这可能是GCC的错,请参阅。