【问题标题】:Valgrind C++ memory leak in empty file空文件中的 Valgrind C++ 内存泄漏
【发布时间】:2015-11-11 18:59:19
【问题描述】:

我对 valgrind 中的“额外”内存泄漏有疑问。例如,我创建了一个名为 temp.cpp 的测试程序:

int main() { return 0; }

在终端中,我运行:

>> g++ -o temp.out temp.cpp
>> valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all ./temp.out

这会导致多次内存泄漏。这怎么可能?

==4438== LEAK SUMMARY:
==4438==    definitely lost: 4,120 bytes in 2 blocks
==4438==    indirectly lost: 2,288 bytes in 6 blocks
==4438==      possibly lost: 8,336 bytes in 99 blocks
==4438==    still reachable: 6,440 bytes in 13 blocks  
==4438==         suppressed: 5,020 bytes in 73 blocks

我尝试过运行其他 .cpp 文件并且得到完全相同的泄漏摘要。大约一个月前,当我尝试时,没有任何问题。如果这可能是问题(?),我可能已经升级了 Xcode 或其他东西。这些是我对 g++ 的设置:

配置:

--prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1

Apple LLVM 版本 6.1.0 (clang-602.0.53)(基于 LLVM 3.6.0svn) 目标:x86_64-apple-darwin15.0.0 线程模型:posix

【问题讨论】:

  • FWIW,我没有在带有 GCC 5.2 的 Linux/Debian/x86-64 上观察到这一点; valgrind 中的三个“丢失”行给了我 0;同样适用于 Clang 3.7;这可能是 MacOSX 特有的问题
  • 听起来您应该向 valgrind 人员提交错误报告。我不确定您希望 stackoverflow 如何为您提供帮助。
  • 有时第三方库会造成您无法修复的泄漏(除非您修复了库)。它们由 valgrind 报告,但您可以使用 valgrind 中的 sup 文件来抑制它们。出于某种原因,也许您的 libc 泄漏或加载程序......拥有完整的回溯会很有趣。

标签: c++ xcode macos valgrind


【解决方案1】:

似乎 valgrind 在 MacOSX 上存在问题。虽然这些问题没有得到解决,但可能的临时解决方案是使用抑制文件。更多详情请查看this other answer

【讨论】:

    【解决方案2】:

    我试图重现这一点,但我无法在我的机器上重现。最新的 valgrind 似乎没有泄漏。尝试 brew upgrade valgrind

    C02QH2D7G8WM:simple userone$ valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all ./temp.out
    ==1917== Memcheck, a memory error detector
    ==1917== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
    ==1917== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
    ==1917== Command: ./temp.out
    ==1917== 
    ==1917== 
    ==1917== HEAP SUMMARY:
    ==1917==     in use at exit: 22,177 bytes in 189 blocks
    ==1917==   total heap usage: 255 allocs, 66 frees, 27,953 bytes allocated
    ==1917== 
    ==1917== 2,064 bytes in 1 blocks are possibly lost in loss record 57 of 62
    ==1917==    at 0x10000817C: malloc_zone_malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
    ==1917==    by 0x1005E0EFD: _objc_copyClassNamesForImage (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005D4182: protocols() (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005D4093: readClass(objc_class*, bool, bool) (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005D1C13: gc_init (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005D924E: objc_initializeClassPair_internal(objc_class*, char const*, objc_class*, objc_class*) (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005E6132: layout_string_create (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005D483C: realizeClass(objc_class*) (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005D4300: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005D42E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005D42E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
    ==1917==    by 0x1005D42E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
    ==1917== 
    ==1917== LEAK SUMMARY:
    ==1917==    definitely lost: 0 bytes in 0 blocks
    ==1917==    indirectly lost: 0 bytes in 0 blocks
    ==1917==      possibly lost: 2,064 bytes in 1 blocks
    ==1917==    still reachable: 0 bytes in 0 blocks
    ==1917==         suppressed: 20,113 bytes in 188 blocks
    ==1917== 
    ==1917== For counts of detected and suppressed errors, rerun with: -v
    ==1917== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 17)
    

    【讨论】:

      猜你喜欢
      • 2020-03-31
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2015-06-28
      • 1970-01-01
      • 2013-06-24
      • 2019-07-02
      相关资源
      最近更新 更多