Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Valgrind不';无法检测到任何内存泄漏。那有多安全?_C++_Memory Leaks_Valgrind - Fatal编程技术网

C++ Valgrind不';无法检测到任何内存泄漏。那有多安全?

C++ Valgrind不';无法检测到任何内存泄漏。那有多安全?,c++,memory-leaks,valgrind,C++,Memory Leaks,Valgrind,我通过valgrind运行了我的代码,结果如下: ==4492==Memcheck,内存错误检测器 ==4492==2002-2009年版权(C)和GNU GPL'd,由朱利安·苏沃德等人出版。 ==4492==使用Valgrind-3.5.0和LibVEX;使用-h重新运行版权信息 ==4492==命令:./mem ==4492==父PID:4455 ==4492== ==4492== ==4492==堆摘要: ==4492==在出口处使用:0个块中有0个字节 ==4492==总堆使用率:19

我通过
valgrind
运行了我的代码,结果如下:

==4492==Memcheck,内存错误检测器
==4492==2002-2009年版权(C)和GNU GPL'd,由朱利安·苏沃德等人出版。
==4492==使用Valgrind-3.5.0和LibVEX;使用-h重新运行版权信息
==4492==命令:./mem
==4492==父PID:4455
==4492==
==4492==
==4492==堆摘要:
==4492==在出口处使用:0个块中有0个字节
==4492==总堆使用率:19595342个allocs,19595342个frees,27194270个字节分配 ==4492==
==4492==所有堆块都已释放--不可能有泄漏
==4492==
==4492==对于检测到的和抑制的错误计数,请使用:-v
==4492==错误摘要:0个上下文中的0个错误(已抑制:4个上下文中的4个)

然而,当代码运行时,我看到程序使用的内存有了一个小的、稳定的增长。我对这个结果有多肯定

我使用以下方法运行
valgrind

valgrind --track-origins=yes --leak-check=yes
    --tool=memcheck --read-var-info=yes --log-file=error.txt`

我使用
-g
-march=core2
标记编译程序。

内存使用量的小幅度增加不一定是需要担心的-可能是您的程序正在加速,并将在某个点达到峰值。如果不知道该应用程序的逻辑,就很难判断。然而,它坚持所有分配的块都被释放,这通常是相当好的

你可能想考虑让它运行更长时间,增加它必须做的工作(再次这取决于应用程序),看看它是否永远达到峰值或继续上升(或者,直到它耗尽虚拟内存,无论如何)。 我还要看最后两行:

==4492== For counts of detected and suppressed errors, rerun with: -v
==4492== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4) 

您可能需要使用
-v
运行它,以检查这些抑制是什么。它们可能没什么,但仔细研究一下也无妨。

您是否看到top这样的工具会增加内存使用量?根据程序的行为,如果不断分配和释放内存,可能会引入碎片,导致地址空间增长。如果让进程运行足够长的时间,它可能会稳定下来并停止增长。

valgrind
可以检测内存泄漏,但不能检测内存的不良使用情况。代码中的一个bug可能会无缘无故地不断分配内存,而防御代码随后会将其全部清除

也就是说,我也不相信您确定进程内存使用情况的机制。在幕后有很多事情要做:比如缓存


我认为这是“不确定的”。

您需要区分内存泄漏(已分配的内存,但您丢失了对它的所有引用)和内存占用(已分配的内存,您保留了对它的引用,但忘记了释放)

valgrind无法检测到后者,因为valgrind不知道您不想再使用它


要获得有关程序内存使用情况的一些统计信息,可以使用valgrind的massif工具,该工具将更详细地显示内存的分配位置。这可能有助于查找内存占用。

不要被操作系统对进程进行的静默缓存所愚弄。实际上,valgrind将检测到在程序退出时仍然分配的内存,对这些内存的引用仍然存在。@Hasturkun:是的,但它不会检测到在程序运行期间忘记释放的内存,但最终还是放弃了。就像你总是新的,然后不是删除,而是把东西推到一个你认为是从中分配的池中。我有一个映射,其中
vector
作为键,
set
作为值,我不断清除并重新创建,还有一个
set
,我也不断清除并添加值。这两个因素会导致记忆增加吗?@Yotam:如果没有更详细的分析,很难判断,你可以用massif来分析。请注意,根据用于确定程序内存使用情况的工具,它们可能会显示不同于所有新的/malloc调用总和的内存量,这是由于缓存或碎片等原因造成的。使用massif可以更好地了解是否是程序的错误。