win32 std::thread是否存在内存泄漏问题?

4

我在Windows 7 32位系统下使用MinGW gcc 4.8.2编译了以下代码:

// t.cpp
#include <iostream>
#include <thread>

class Mine
{
public:
    Mine() { std::cout << "Ctor called\n"; }
    ~Mine() { std::cout << "Dtor called\n"; }
};

void foo(const Mine &a, const Mine &s)
{
}

int main()
{
    Mine a, b;
    std::thread t(&foo, std::ref(a), std::ref(b));
    t.join();

    return 0;
}

使用 g++ t.cpp -std=c++11 -static -ggdb 进行编译,然后使用 drmemory a.exe 通过 Dr. Memory 进行调试,我得到了以下输出:

Dr. Memory version 1.6.1739 build 42 built on Feb 23 2014 22:29:25
Dr. Memory results for pid 7400: "a.exe"
Application cmdline: "a.exe"
Recorded 102 suppression(s) from default C:\Users\apple\Desktop\drmemory\bin\suppress-default.txt

Error #1: LEAK 32 direct bytes 0x00d70e70-0x00d70e90 + 32 indirect bytes
# 0 replace_calloc                      [e:\b\build\slave\win-builder\drmemory\common\alloc_replace.c:2338]
# 1 pthread_spin_init                   [C:\Users\apple\Desktop/t.cpp:22]
# 2 static_spin_init                    [C:\Users\apple\Desktop/t.cpp:22]
# 3 pthread_getspecific                 [C:\Users\apple\Desktop/t.cpp:22]
# 4 _Unwind_SjLj_Register               [C:\mingw482\i686-482-posix-sjlj-rt_v3-r2\build\gcc-4.8.2\i686-w64-mingw32\libgcc/./gthr-default.h:719]
# 5 msvcrt.dll!_endthreadex
# 6 msvcrt.dll!_endthreadex
# 7 KERNEL32.dll!BaseThreadInitThunk   +0x11     (0x77021174 <KERNEL32.dll+0x51174>)

===========================================================================
FINAL SUMMARY:

DUPLICATE ERROR COUNTS:

SUPPRESSIONS USED:

ERRORS FOUND:
      0 unique,     0 total unaddressable access(es)
      0 unique,     0 total uninitialized access(es)
      0 unique,     0 total invalid heap argument(s)
      0 unique,     0 total GDI usage error(s)
      0 unique,     0 total warning(s)
      1 unique,     1 total,     64 byte(s) of leak(s)
      0 unique,     0 total,      0 byte(s) of possible leak(s)
ERRORS IGNORED:
     28 unique,    28 total,   1215 byte(s) of still-reachable allocation(s)
         (re-run with "-show_reachable" for details)
Details: C:\Users\apple\Desktop\drmemory\drmemory\logs\DrMemory-a.exe.7400.000\results.txt

a.exe本身的输出是(正确的)“Ctor called”*2和“Dtor called”*2。我没有看到任何可能导致泄漏的东西。

附言:我尝试了mingw-gcc 4.8.2的dwarf2和sjlj版本,两者产生了相同的结果。

另附言:我刚刚尝试了boost线程库,结果仍然类似。如果有人能使用MSVC尝试一下,我将不胜感激。


2
就此而言,我在Linux上使用g++ 4.8.2编译了相同的代码。Valgrind报告“所有堆块都已释放,不可能有泄漏”,因此要么是在更新的libstdc++中修复了错误,要么是底层的Windows线程实现正在泄漏。 - Tristan Brindle
@TristanBrindle 我明白了。你能否尝试使用MSVC呢?我没有在我的电脑上安装它。 - Zizheng Tai
很抱歉,我没有可用的Windows机器。 - Tristan Brindle
3
尝试创建几千个线程,然后观察泄漏的内存是否增加。运行时在启动时分配一些内存并不罕见(由于内存在退出时被释放,因此它从未被释放)。唯一的缺点是内存泄漏检测器可能会报告错误的阳性结果。 - nos
可在进程关闭时被释放的可访问内存不是泄漏。 - Martin James
显示剩余2条评论
1个回答

0
通常情况下,–ignore_early_leaks 可以帮助解决问题,否则如果你能证明这不是一个泄漏(看起来也不像),如评论中所建议的,你需要在应用程序中使用 -suppress 来抑制这些错误。请参阅文档中的抑制格式示例。

谢谢,但是使用-ignore_early_leaks选项后,Dr. Memory仍然会检测到所谓的泄漏。不过,我猜它们并不是真正的泄漏。 - Zizheng Tai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接