簡體   English   中英

地圖/迭代器增量錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM