【发布时间】:2021-06-21 15:01:12
【问题描述】:
由于意外行为,我发生了崩溃。我想问一下如何修改代码以防止发生的崩溃。
void SubscManag::handleNotif(Notif notif)
{
std::cout << "Current subscribe size: " << subs_.size();
std::map<int, SubscData>::iterator it;
{
std::lock_guard<std::recursive_mutex> lock(mutex_);
it = subs_.begin();
}
for (;;)
{
std::lock_guard<std::recursive_mutex> lock(mutex_);
if (it == subs_.end())
{
break;
}
if (it->second.hasToBeErased)
{
std::cout << "Erase id : " << it->first;
it = subs_.erase(it);
continue;
}
if (cond)
{
// ....
++it;
continue;
}
// ....
++it;
}
}
崩溃发生在 it = subs_.erase(it); 有了这个
Erase id : 2
Erase id : 3
Erase id : 28473456
所以Element with id : 28473456 可能不存在或已损坏,但我该如何防御崩溃?
谢谢。
【问题讨论】:
-
我无法复制它
-
如果你不能用完整的代码重现它,你希望我们如何只用部分代码?请提供minimal reproducible example。我的完整猜测是您在多个线程上对
handleNotif的调用重叠,其中一个线程使另一个线程的迭代器无效 -
我只是在寻求建议|如何让这部分代码更安全。很明显,在 subs_ 中没有插入任何 28473456 id
-
您的第一个锁是“错误的”,因为
it在进入循环之前可能会失效。
标签: c++ c++11 crash segmentation-fault c++14