【问题标题】:Copying the Contents of a boost::shared_ptr - is there a way?复制 boost::shared_ptr 的内容 - 有没有办法?
【发布时间】:2014-03-06 15:11:03
【问题描述】:

我想复制我在函数中得到的 boost::shared_ptr 的内容

void virtual Add(const T_Value& value)
    {           
        push_back(value);
        if (_limit != -1 && int(size()) > _limit)
            erase(begin());//,begin() + (_limit >> 1));
    }

其中 T_Value 是 boost::shared_ptr<ValueType>

我的问题是,使用这种方法,value 的 use_count 显然会增加,因为它现在在 std::list 中有另一个引用,这个函数是其中的一部分。

然而,我想要做的只是将value 的内容复制到一个新的 shared_ptr 中,一个具有新计数的,然后将其插入到列表中。

因此,函数末尾的 use_count - (离开作用域)将保持 value 的原始 use_count 为 value;以及将插入到列表中的新 shared_ptr 的 use_count 为 1。

【问题讨论】:

  • 如果您的ValueType 有一个复制构造函数,则使用现有值(最好通过make_shared)构造一个new 值,并保留shared_ptr 中的结果指针。跨度>

标签: c++ boost shared-ptr


【解决方案1】:

您可以使用make_shared 克隆共享指针:

push_back(boost::make_shared<decltype(*value)>(*value));

在 C++03 上:

push_back(boost::make_shared<typename T_Value::element_type>(*value));

【讨论】:

  • 不会增加原始值的use_count吗?
  • @Cypher_CS:不,它通过复制*value 和一个新的(当前未共享的)指向它的指针来创建一个新对象。但是,如果指针指向基类,请注意切片。
  • 做了第二个 - 但它给了我一个error C2664: 'std::list&lt;_Ty&gt;::push_back' : cannot convert parameter 1 from 'boost::shared_ptr&lt;T&gt;' to 'const boost::shared_ptr&lt;T&gt; &amp;'
  • 由于某种原因我无法访问 element_type。有什么想法吗?
  • @ecatmur 我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多