[英]Map/iterator incremental error
以下代碼引發調試斷言映射/迭代器增量錯誤..
void ClassA::Remove()
{
std::map<int, CVClassB*>::iterator it(m_p.begin());
while ( it != m_p.end() )
{
if (it->first >= 0)
{
m_p.erase(it);
it++;
}
}
}
你能告訴我這是什么錯誤嗎
std::map::erase
使操作它的迭代器無效。 因此,事后增加它是不安全的。 但是, erase()
確實為您返回了下一個迭代器:
it = m_p.erase(it);
另外,您只能在if
內將it
遞增,因此,除非所有鍵都>=0
,否則您將陷入無限循環。 您可能想要類似的東西:
// delete all keys >= 0
if (it->first>=0) {
it = m_p.erase(it); // erase and increment
}
else {
++it; // just increment
}
另外,正如弗拉德的答案所暗示的那樣,誰來管理CVClassB*
的生命周期? 需要delete
嗎? 為什么不使用指針,您可能可以將值直接存儲在映射中。 (或使用智能指針 )。
像這樣寫循環
while ( it != m_p.end() )
{
if (it->first >= 0)
{
it = m_p.erase(it);
}
else
{
++it;
}
}
同樣,您似乎應該刪除擦除的迭代器指向的對象。 例如
delete *it;
it = m_p.erase(it);
您可以通過刪除循環內部來使迭代器無效,但無論如何,所有操作都將清除映射。 只需調用m_p.clear()
,它將完全執行您要嘗試執行的操作。 雖然不能確定您打算做什么,但是那是另一個問題。
如果要刪除指向的對象,請先刪除它們,然后清除地圖。
for(item : m_p)
delete item->second;
m_p.clear();
//done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.