[英]Accessing std::vector containing boost::shared_ptr<CustomObj> -> does at() return a copy of shared pointer?
我现在是第一次使用boost :: shared_ptr。 我有一个std :: vector包含boost :: shared_ptr,我用从自定义类创建的对象“填充”了它。
在代码中: 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);
}
我以前认为这不会有任何问题,但是由于我的程序表现得很奇怪,所以我将改变主意。 :)为了澄清这一点,我现在在这个平台上问你。 :)
是的,如果我的向量超出范围,我的对象将被破坏吗? 如果是,我如何设法获取shared_ptr的深层副本(而不是它所保存的对象)。 刚刚提到:我的应用程序基于QT。
谢谢你的阅读。
请参阅文档之一以了解std::vector<T>::at()
。 它返回一个参考。 只要您emit sendObjToThread1(obj);
确保您安全的shared_ptr
副本。
否。它返回参考。
boost::shared_ptr<Foo> obj = data.at(k);
但是在此语句中,您是通过创建obj进行复制的。
boost::shared_ptr<Foo>& obj = data.at(k);
^^^
现在没有副本。
那条线呢?
sendObjToThread1(obj);
您传递的是参考还是价值? 如果您通过引用传递给另一个线程,那么这将是一个问题,因为obj的本地副本即将死亡(该函数返回时)。 因此,您必须按值传递obj以确保另一个线程具有其自己的副本,并适当地增加shared_pointer计数器。
我认为您正在使用线程。 请阅读并仔细检查与线程安全有关的所有内容。 确保您正在使用pthreads或无锁实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.