【发布时间】:2020-10-28 14:46:11
【问题描述】:
我正在编写一个 C++ 程序并注意到一些有趣的事情,valgrind 说这个程序没有泄漏,但同时说分配的数量不等于释放的数量。
这对我来说似乎很奇怪:
==8676== HEAP SUMMARY:
==8676== in use at exit: 0 bytes in 0 blocks
==8676== total heap usage: 42 allocs, 45 frees, 78,672 bytes allocated
==8676==
==8676== All heap blocks were freed -- no leaks are possible
我没有研究这么多,但是如果堆内存没有被释放,它是丢失。由于我们不再有指向它的指针,它永远不会是免费的。那为什么会这样呢?
编辑:所以在这种情况下,我们的 frees 比 allocs 多。 Valgrind 确实以“无效写入”的形式显示错误。但可能我的误解来自于我认为 allocs 和 frees 总是必须彼此相等以避免内存泄漏。
【问题讨论】:
-
看起来您在此处显示 更多 个空闲而不是 alloc...
-
请注意,您有 更多 个空闲空间而不是分配空间!如果您使用 NULL 指针调用
free,它什么也不做!但是,没有代码,我真的无法提供任何进一步的解释。 -
@FrançoisAndrieux:输出报告的是 new 和 delete 被调用的次数,而不是它们在代码中出现的次数。
-
@DanielMcLaury
delete nullptr;算作删除调用吗? (当然在代码中我宁愿是delete some_ptr;而some_ptr恰好是nullptr) -
如果你解决了你的误解(frees vs allocs),这将是一个很好的问题。如果您还添加minimal reproducible example,这将是一个非常好的问题;)