【问题标题】:Accessing std::vector containing boost::shared_ptr<CustomObj> -> does at() return a copy of shared pointer?访问包含 boost::shared_ptr<CustomObj> -> 的 std::vector 是否会返回共享指针的副本?
【发布时间】:2011-07-09 02:09:15
【问题描述】:

我是第一次使用 boost::shared_ptr 的新手。我有一个包含 boost::shared_ptr 的 std::vector,我用从自定义类创建的对象“填充”了它。

输入代码:std::vector&lt;boost::shared_ptr&lt;Foo&gt;&gt; data;

向量是在堆栈上的函数内部创建的。我想使用 vector.at(k) 访问我的向量中的一些元素。返回的 shared_ptr 将被发送到另一个线程,我们称他为 T1。当 T1 仍在处理 shared_ptr 时,我的向量超出范围。

在代码中:

void myFunction(){

   //lets get my object
   boost::shared_ptr<Foo> obj = data.at(k);

   //emit it to Thread T1 (i am using QT)
   emit sendObjToThread1(obj);

}

我以前认为这不会有问题,但由于我的程序表现得很奇怪,我即将改变主意。 :) 为了澄清这一点,我现在在这个平台上问你。 :)

如果我的向量超出范围,我的对象将被销毁,对吗?如果是,我怎样才能获得 shared_ptr 的深层副本(但不是它所拥有的对象)。顺便提一下:我的应用程序是基于 QT 的。

感谢阅读。

【问题讨论】:

    标签: c++ boost shared-ptr


    【解决方案1】:

    没有。它返回一个引用。

    boost::shared_ptr<Foo> obj = data.at(k);
    

    但在这个语句中,你是通过创建 obj 来制作副本。

    boost::shared_ptr<Foo>& obj = data.at(k);
                         ^^^
    

    现在没有复制。

    编辑:

    这条线呢?

    sendObjToThread1(obj);
    

    你传递的是参考还是价值?如果您通过引用传递给另一个线程,那么这是一个问题,因为 obj 的本地副本即将死亡(只要函数返回)。因此,您必须按值传递 obj 以确保其他线程有自己的副本并适当地递增 shared_pointer 计数器。

    【讨论】:

    • 好的,谢谢。所以我的程序的奇怪行为的问题在其他地方。 :D
    【解决方案2】:

    请参阅std::vector&lt;T&gt;::at() 的文档之一。它返回一个引用。只要您的emit sendObjToThread1(obj); 复制了shared_ptr,您就安全了。

    【讨论】:

    • 正确性与 emit 的作用无关,因为 obj 已经是引用对象的副本(声明中没有 &amp;
    【解决方案3】:

    我认为您正在使用线程。转到read this 并仔细检查与线程安全相关的所有内容。确保您使用的是 pthreads 或无锁实现。

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 2018-11-12
      • 2011-04-12
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多