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