【问题标题】:Does boost::optional trigger a ref count on shared_ptr?boost::optional 会触发 shared_ptr 上的引用计数吗?
【发布时间】:2013-04-05 16:56:12
【问题描述】:

我正在尝试获取一个函数来从我的地图中返回一个可选值。所以是这样的:

boost::optional<V> findValue(const K& key) {
    boost::optional<V> ret;
    auto it = map.find(key);
    if (it != map.end()) {
        ret = it->second;
    }
    return ret;
}

如果V 恰好是某种shared_ptr 类型,那么对ret 的赋值会触发引用计数吗?

【问题讨论】:

    标签: c++ boost shared-ptr


    【解决方案1】:

    是的,必须这样做。 boost::optional 存储一个副本,因此对于 shared_ptr,这意味着存在 shared_ptr 的副本,这意味着必须增加引用计数。

    请注意,只要boost::optional 为空,即它不包含shared_ptr 的值,就没有对象的引用计数被摆弄。换句话说,一个空的boost::optional 确实包含一个(空的或其他的)shared_ptr

    请求的“语义”无法真正起作用,因为您在地图中保留了一个shared_ptr,然后返回了一个shared_ptr

    但是,您可以返回boost::optional&lt;const V&amp;&gt;

    boost::optional<const V&> findValue(const K& key) {
        auto it = map.find(key);
        if (it != map.end()) {
            return boost::optional<const V&>( it->second );
        }
        return boost::optional<const V&>();
    }
    

    但请确保参考在您保留/使用时保持有效。

    【讨论】:

    • @Barry 这会严重违反shared_ptr 不变量,不是吗?
    • 可以创建boost::optional&lt;std::reference_wrapper&lt;const std::shared_ptr&lt;T&gt;&gt;&gt;吗?
    • @Barry 原来你可以使用boost::optional 的引用,这可能会提供一种解决引用计数问题的方法。
    • 就个人而言,我会返回一个指针而不是一个可选的引用。
    • 我同意 M. Seymour 的观点——我认为引用和指针之间的真正区别在于指针是可选的(可能为 null)。
    【解决方案2】:

    是的。复制共享指针,在这种情况下,通过复制初始化包含在 optional 对象中的指针,将增加使用计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2016-03-15
      • 2020-09-25
      相关资源
      最近更新 更多