我是第一次使用它的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。
感谢阅读。
答案 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或无锁实现。