c++ - 导致线程释放内存泄漏?
问题描述
我有一个多线程代码。这是我的代码的一个简单示例:
void SomeClass::ExampleForThread2()
{
m_thread_ptr = std::make_unique<std::thread>([=]() {
while (! m_stop)
{
try
{
// ... do work
}
catch (...)
{
// ...
}
}
#pragma messsage(__DBG__"TODO: not known if release results in a mem leak. Please investigate.")
//m_thread_ptr.reset(); // now exception will be raised during destruction of std::thread
m_thread_ptr.release(); // no exception. Will there be a Memory leak for std::thread ?
});
}
如果 m_stop 为真,则 while 循环停止。请问thread2比自动清理吗?在那种情况下,我可以释放并且没有内存泄漏。但这是真的吗?
我现在的答案是:
void SomeClass::ExampleForThread2()
{
if (m_thread_ptr != nullptr)
{
if (m_thread_ptr->joinable())
{
m_tread_ptr->join()
}
}
.......
我删除了这部分:
#pragma messsage(__DBG__"TODO: not known if release results in a mem leak. Please investigate.")
//m_thread_ptr.reset(); // now exception will be raised during destruction of std::thread
m_thread_ptr.release(); // no exception. Will there be a Memory leak for std::thread ?
});
该函数是单线程的,不需要锁。
解决方案
m_thread_ptr.reset
当它仍然可以连接时,将尝试销毁您的线程对象。这是对std::terminate
.
m_thread_ptr.release
是内存泄漏,是的:您从unique_ptr
对象中提取指针,然后将其放在地板上。
只需让函数“用完”,让SomeClass
析构函数清理剩余的线程状态。
推荐阅读
- angular8 - 在 Angular 8 上使用自定义全局库的更好方法是什么?
- python - “瞳孔”对象不可迭代
- typescript - 如何在 TS 中使用变量为对象成员赋值
- python - 枢轴熊猫数据框以正确顺序获取结果数据框
- javascript - 反应中未定义handleChange no-undef
- kubernetes - 如何执行 kubelet --resolve-conf?:
- powershell - 使用批处理脚本在不断变化的文件中查找字符串
- javascript - 如何使用 axios 从服务器获取有限的数据?
- c++ - 什么时候调用 constinit 对象的析构函数?
- r - R中的线性搜索