返回数据结构拥有的对象的引用

3

我的设置:

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);
}

这会导致分段错误,还是总是有效?

可能是迭代器失效规则的重复问题。 - Lightness Races in Orbit
3个回答

1

取决于您对集合的操作。

std :: set 中插入和移除元素不会使指向其他元素的迭代器失效,但是如果您将从集合中删除元素,则指向它的迭代器和引用将失效,您可能最终会得到一个无效的引用。


很可能是的(如果您使用指针,请考虑使用智能指针),但是不知道您的应用程序逻辑很难说。我猜这完全取决于您是否需要引用语义。也许这个问答可以帮助阐明。 - Andy Prowl
实际上,智能指针并不是很合适,因为返回的指针没有所有权。除非你想让整个容器包含shared_ptr或其他东西。 - Seth Carnegie
@SethCarnegie:就是这个意思。容器将会是一个 set<shared_ptr<T>> - Andy Prowl

0

不是这段代码本身的问题。但你可能会删除一个对象,然后仍然尝试在以后使用它的引用。


0

我强烈反对这种策略,即使您不打算使用erase,未来的修改也可能导致严重的错误。

如果您的对象足够小,请通过复制返回它。

如果对象相当大,也许您可以使用boost智能指针以避免分段错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接