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