C++ 程序潜在的内存泄漏
c++ program potential memory leak
我每 40ms 调用一次以下void function()
函数,我发现内存消耗稳步增加。消费起初并不明显,但经过几天,消费量很大。 任何人都可以帮助解释此代码的问题。 是线程问题还是导致内存泄漏std::move
问题。
void do_task(const std::vector<int>& tmp)
{
// do some work here
}
void function()
{
std::vector<std::thread> task;
std::vector<int> tmp1, tmp2;
GetTempValue(tmp1);
GetTempValue(tmp2);
task.push_back(std::thread(do_task, std::move(tmp1)));
task.push_back(std::thread(do_task, std::move(tmp2)));
tmp1.clear();
tmp2.clear();
UpdateTempValue(tmp1);
UpdateTempValue(tmp2);
task.push_back(std::thread(do_task, std::move(tmp1)));
task.push_back(std::thread(do_task, std::move(tmp2)));
tmp1.clear();
tmp2.clear();
for(int i=0; i<task.size(); i++)
{
task[i].join();
}
}
传递对线程的引用是一个很大的禁忌。 或者至少是一个等待发生的错误...
您应该尝试重新定义 do 任务以按值接受 std::vector。 这不是您通过调用 std::move 将它们传递给线程来尝试做的事情吗?
将do_task的定义更改为:
void do_task(std::vector<int> tmp);
我做了一些快速计算。 如果由 function(( 启动的线程泄漏,每 40ms 启动 4 个线程,泄漏率应该超过 1.4MB/小时。 如果您的泄漏小于此值,则应开始在代码中的其他地方查找。
无论如何,每秒启动 100 个线程并不是真正有效的。创建线程时会损失很大一部分计算能力。您是否考虑过其他选择?
让 4 个线程运行无限循环,并将工作排队到它们将更有效率,对操作系统的负担更少,并且更不容易发生您无法控制的泄漏。
我认为openmp可能是插曲。OpenMP 是一个用于开发并行应用程序的 API。
https://en.m.wikipedia.org/wiki/OpenMP
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏