c++ - Valgrind 在 unittest-cpp 库中显示内存泄漏

标签 c++

我正在使用 unittest-cpp图书馆。我决定在 valgrind 的帮助下检查其中一个单元是否存在内存泄漏。我得到这样的报告:

==35820== HEAP SUMMARY:
==35820== in use at exit: 26,151 bytes in 188 blocks
==35820== total heap usage: 259 allocs, 71 frees, 32,151 bytes allocated
==35820==
==35820== 148 (80 direct, 68 indirect) bytes in 1 blocks are definitely lost in loss record 43 of 65
==35820== at 0x100023D81: malloc (vg_replace_malloc.c:303)
==35820== by 0x1002CB8D6: __Balloc_D2A (in /usr/lib/system/libsystem_c.dylib)
==35820== by 0x1002CC21F: __d2b_D2A (in /usr/lib/system/libsystem_c.dylib)
==35820== by 0x1002C8877: __dtoa (in /usr/lib/system/libsystem_c.dylib)
==35820== by 0x1002F13E6: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==35820== by 0x10031A6C8: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==35820== by 0x1002F0389: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==35820== by 0x1002EE223: printf (in /usr/lib/system/libsystem_c.dylib)
==35820== by 0x10000AA59: UnitTest::TestReporterStdout::ReportSummary(int, int, int, float) (TestReporterStdout.cpp:43)
==35820== by 0x10000AF9E: UnitTest::TestRunner::Finish() const (TestRunner.cpp:43)
==35820== by 0x10000B2F4: int UnitTest::TestRunner::RunTestsIf(UnitTest::TestList const&, char const*, UnitTest::True const&, int) const (in ./BuilderTests)
==35820== by 0x10000ACEF: UnitTest::RunAllTests() (TestRunner.cpp:17) ==35820==
==35820== LEAK SUMMARY:
==35820== definitely lost: 80 bytes in 1 blocks
==35820== indirectly lost: 68 bytes in 2 blocks
==35820== possibly lost: 2,064 bytes in 1 blocks
==35820== still reachable: 4,096 bytes in 1 blocks
==35820== suppressed: 19,843 bytes in 183 blocks

但是 valgrind 没有指向我的代码。 然后我决定从 GSL 构建和检查单元库,它也使用 unittest-cpp。我得到了同样的报告。

我可以信任 valgrind 吗?

最佳答案

您通常可以信任 Valgrind 报告事实。但是你如何解释这些很重要。并非所有泄漏都是平等的。

并非所有内存泄漏都是问题。如果已知某些对象的析构函数没有相关工作要做并因此“泄漏”它们,则程序可能会在关闭期间合法地忽略释放某些对象 - 让操作系统在进程退出时清理内存。

所以,可能确实存在问题。但也可能是库出于性能或方便的原因故意泄漏了一些对象。

只有当内存泄漏导致内存使用在运行时不断增加时,它才是真正的问题。

泄漏如 - 资源被分配一次并持续到程序结束并且永远不会被释放 - 只有当资源非常大并且可以被释放时才真的是一个问题尽早,以便内存可以用于更好的事情,和/或如果资源具有析构函数,那么运行它很重要。

请记住,一旦程序终止,它分配的所有内存都会返回给系统(罕见的异常(exception)情况,如“sysv 共享内存”等除外)。除了程序终止之外,内存泄漏不会影响系统。

关于c++ - Valgrind 在 unittest-cpp 库中显示内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38286111/

相关文章:

C++ 简单循环引用和前向声明问题

c++ - C++模板中的隐式类型转换

c++ - 如何为这个结构实现 [] 运算符?

c++ - 获取应用程序 Windows 的完整目录

c++ - 有没有我不会使用 std::make_shared 的情况?

c++ - 没有命名参数的可变参数函数

android - 进入iOS和Android编程

c++ - 在 C++ 客户端套接字应用程序中等待传入数据

c++ - 尝试访问数组时数据从数组中丢失

c++ - 如何使模板原型(prototype)继承,以便所有特化都继承相同的类/接口(interface)?