我有一些代码,我正在使用gcc 4.7 (从3.1)更新到C++11。
我将一个多集定义为一个类的私有成员:
multiset <Object*, objectcomp> objects_;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也不起作用)
发布于 2012-11-29 10:02:18
将迭代器设置为NULL从来都不合法。
正确的答案是:
q = objects_.end();或者,在某些情况下:
q = multiset<Object*, objectcomp>::iterator();发布于 2012-11-29 10:04:48
您永远不能将迭代器设置为NULL。如果上面的代码曾经工作过,那完全是偶然的。考虑到multiset的任何合理实现,很难看出它是如何编译的,更不用说运行了。
获得“无处”迭代器的最好方法是使用容器的末尾。用q = objects_.end()替换q = NULL。
此外,不要将原始指针放在容器中;这是对内存泄漏的公开邀请。您几乎肯定需要multiset<Object,comp>或multiset<shared_ptr<Object>,comp>。
https://stackoverflow.com/questions/13617646
复制相似问题