【问题标题】:Returning a reference to an object owned by a data structure返回对数据结构拥有的对象的引用
【发布时间】:2013-02-04 18:04:56
【问题描述】:

我的一套:

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

这可能会导致分段错误,或者这将始终有效?

【问题讨论】:

标签: c++


【解决方案1】:

取决于您如何处理该集合。

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

【讨论】:

  • 可能是的(如果您将使用指针,请考虑使用 smart 指针),但如果不了解应用程序的逻辑就很难说。我想这完全取决于您是否需要引用语义。也许this Q&A 会帮助我们解释
  • 实际上智能指针并不合适,因为返回的指针没有所有权。除非你想让整个容器包含shared_ptr 或其他东西。
  • @SethCarnegie:这就是我的意思。容器将是set&lt;shared_ptr&lt;T&gt;&gt;
【解决方案2】:

不是这个代码本身。但是您可能会擦除一个对象,但稍后仍会尝试使用它的引用

【讨论】:

    【解决方案3】:

    如果您不打算使用擦除,我也强烈反对此政策,将来的修改可能会导致严重的错误。

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2015-08-29
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多