我的设置:
std::set<Object> objects;
我想找到一个对象并将其作为引用返回,如果它不存在则也插入它:
const Object& get(params...){
Object obj(params...);
std::set<Object>::const_iterator i = objects.find(obj);
if(i != objects.end())
return *i;
objects.insert(obj);
return * objects.find(obj);
}
这会导致分段错误,或者这会一直有效吗?
答案 0 :(得分:0)
取决于您对该系列的处理方式。
std::set
的插入和删除不会使集合中其他元素的迭代器无效,但是如果要从集合中删除那个元素,那么迭代器和对它的引用将失效,您最终可能会得到无效的引用。
答案 1 :(得分:0)
不是这个代码本身。但是你可能会删除一个对象并仍然试图稍后使用它的引用
答案 2 :(得分:0)
如果你不打算使用擦除,我强烈反对这项政策,未来的修改可能会导致令人讨厌的错误。
如果您的对象足够小,请通过复制返回。
如果对象很大,也许可以使用boost智能指针来避免分段错误。