访问包含boost :: shared_ptr <customobj>的std :: vector - &gt; at()返回共享指针的副本吗?</customobj>

时间:2011-03-04 19:59:46

标签: c++ boost shared-ptr

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

在代码中:std::vector<boost::shared_ptr<Foo>> 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);

//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。

感谢阅读。

3 个答案:

答案 0 :(得分:2)

请参阅std::vector<T>::at()的其中一个文档。它返回一个引用。只要您的emit sendObjToThread1(obj);复制shared_ptr您就是安全的。

答案 1 :(得分:2)

没有。它返回一个引用。

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

但在本声明中,您通过创建obj来制作副本。

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

现在没有制作副本。

编辑:

这条线怎么样?

sendObjToThread1(obj);

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

答案 2 :(得分:0)

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