在 std::thread c++ 中处理泄漏
Handle leak in std::thread c++
今天我在使用 std::thread 时注意到一个奇怪的想法。这是最小的测试用例:
void test()
{
std::thread t1([] {});
t1.join();
}
每次我运行这段代码,一个Handle泄露。
这是来自 ProcessExplorer 的视图。这些泄漏的句柄是线程互斥锁“BaseNammedObjects\bx_thread_mutex”
这些互斥量不会在未来任何时候释放。这是一些已知问题吗?
我正在使用最新的 Visual Studio 2019 16.7.3,我正在 32 位应用程序上对其进行测试(也在调试和发布)。
已编辑:
泄漏的句柄与执行次数成线性关系,因此此代码段:
for (int n = 0; n < 1000; n++)
{
std::thread t1([] {});
t1.join();
}
创建 1000 个泄漏句柄:
抱歉 semi-false 警报。
问题似乎是由用于内存泄漏检测的第 3 方插件 Deleaker(我现在正在测试)引起的(有趣,对吧?;-))。
当我禁用这个插件时,一切正常。所以这是 Deleaker 在内部所做的事情。我会把这个问题反馈给作者。
编辑:似乎最新版本的 Deleaker 修复了这个问题。
今天我在使用 std::thread 时注意到一个奇怪的想法。这是最小的测试用例:
void test()
{
std::thread t1([] {});
t1.join();
}
每次我运行这段代码,一个Handle泄露。
这是来自 ProcessExplorer 的视图。这些泄漏的句柄是线程互斥锁“BaseNammedObjects\bx_thread_mutex”
这些互斥量不会在未来任何时候释放。这是一些已知问题吗?
我正在使用最新的 Visual Studio 2019 16.7.3,我正在 32 位应用程序上对其进行测试(也在调试和发布)。
已编辑:
泄漏的句柄与执行次数成线性关系,因此此代码段:
for (int n = 0; n < 1000; n++)
{
std::thread t1([] {});
t1.join();
}
创建 1000 个泄漏句柄:
抱歉 semi-false 警报。
问题似乎是由用于内存泄漏检测的第 3 方插件 Deleaker(我现在正在测试)引起的(有趣,对吧?;-))。
当我禁用这个插件时,一切正常。所以这是 Deleaker 在内部所做的事情。我会把这个问题反馈给作者。
编辑:似乎最新版本的 Deleaker 修复了这个问题。