首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::multiset::iterator = NULL不再有效?

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

Stack Overflow用户
提问于 2012-11-29 09:58:34
回答 2查看 687关注 0票数 5

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

我将一个多集定义为一个类的私有成员:

代码语言:javascript
复制
multiset <Object*, objectcomp> objects_;

代码语言:javascript
复制
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也不起作用)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-29 10:02:18

将迭代器设置为NULL从来都不合法。

正确的答案是:

代码语言:javascript
复制
q = objects_.end();

或者,在某些情况下:

代码语言:javascript
复制
q = multiset<Object*, objectcomp>::iterator();
票数 7
EN

Stack Overflow用户

发布于 2012-11-29 10:04:48

您永远不能将迭代器设置为NULL。如果上面的代码曾经工作过,那完全是偶然的。考虑到multiset的任何合理实现,很难看出它是如何编译的,更不用说运行了。

获得“无处”迭代器的最好方法是使用容器的末尾。用q = objects_.end()替换q = NULL

此外,不要将原始指针放在容器中;这是对内存泄漏的公开邀请。您几乎肯定需要multiset<Object,comp>multiset<shared_ptr<Object>,comp>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13617646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档