簡體   English   中英

std :: multiset :: iterator = NULL不再有效?

[英]std::multiset::iterator = NULL no longer valid?

我有一些代碼,我正在使用gcc 4.7(從3.1)更新到C ++ 11

我有一個multiset定義為類的私有成員:

multiset <Object*, objectcomp> objects_;

在代碼中是一個看起來像這樣的段(p_q是一對多集迭代器,抱歉這個討厭的行,不能等到用auto替換它,哈哈):

void Terrain::removeObject(Object* obj){
    pair<multiset<Object*, objectcomp>::iterator, multiset<Object*, objectcomp>::iterator> p_q;
    multiset<Object*, objectcomp>::iterator p,q;
    q = NULL;
    p_q = objects_.equal_range(obj);
    for(p = p_q.first; p != p_q.second; p++){
        if(*p == obj) {q=p; break;}
    }
    if(q!=NULL){
        ... do stuff based on q no longer being null
    }
}

這將不再編譯。 你不能再將迭代器設置為null嗎? 有什么選擇? (nullptr也不起作用)

將迭代器設置為NULL從來都不合法。 您可能已經幸運了,因為您的特定實現恰好使用指針作為該類型的迭代器,但它仍然是非法的。

正確的答案是:

q = objects_.end();

或者,在某些情況下:

q = multiset<Object*, objectcomp>::iterator();

您永遠不能將迭代器設置為NULL。 如果上面的代碼有效,那就是純粹的意外。 鑒於multiset的任何合理實現,很難看出它是如何編譯的,更不用說運行了。

獲得“無處”迭代器的最佳方法是使用容器的末尾。 q = objects_.end()替換q = NULL

另外,永遠不要將原始指針放在容器中; 這是對內存泄漏的公開邀請。 你幾乎肯定想要multiset<Object,comp>multiset<shared_ptr<Object>,comp>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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