使用shared_mutex导致内存泄漏

问题描述 投票:0回答:1

以下代码会导致内存使用量增加:

#include <shared_mutex>

class foo
{
public:
   void bar()
   {
      std::unique_lock lock(m_mtx);
   }
   std::shared_mutex m_mtx;
};

int main()
{
   while (1)
   {
      foo obj;
      obj.bar();
   }
}

以下内容不会:(仅更改互斥体类型)

#include <mutex>

class foo
{
public:
   void bar()
   {
      std::unique_lock lock(m_mtx);
   }
   std::mutex m_mtx;
};

int main()
{
   while (1)
   {
      foo obj;
      obj.bar();
   }
}

我使用 Windows 7 并使用任务管理器来跟踪程序的内存消耗。

我用 mingw 和这个简单的命令行进行编译:

g++.exe -std=c++17 -o mytest main.cpp

我使用shared_mutex做错了什么?

c++ memory-leaks c++17 mutex
1个回答
0
投票

找到了!很旧的帖子,不知道它是否仍然适合你。

问题似乎出在使用 g++、mingw64 和标准共享互斥体(至少版本 12-posix)。

事实上,使用标准头文件shared_mutex的C++库中存在内存泄漏。当使用 PTHREAD_RWLOCK_INITIALIZER 初始化互斥锁时,不会调用 pthread_rwlock_destroy。但是,使用 pthread_rwlock_init 版本按预期调用 pthread_rwlock_destroy。

我找到了解决办法和解决办法。最简单的方法是从源代码中“禁用”常量初始值设定项 PTHREAD_RWLOCK_INITIALIZER。它强制 C++ 库调用 pthread_rwlock_init 函数,然后调用 pthread_rwlock_destroy 函数。为此,只需在 #include 和 #include 之间插入 #undef:

#include <thread>
#undef PTHREAD_RWLOCK_INITIALIZER
#include <mutex>
#include <shared_mutex>

正确的方法是修补C++标准库的shared_mutex头文件,并在shared_mutex析构函数中调用pthread_rwlock_destroy函数,即使使用常量初始值设定项PTHREAD_RWLOCK_INITIALIZER也是如此。 如果我找到方法和时间,我将提交标准共享互斥头文件的常规补丁。

© www.soinside.com 2019 - 2024. All rights reserved.