我是第一次使用 boost::shared_ptr 的新手。我有一个包含 boost::shared_ptr 的 std::vector,我用从自定义类创建的对象“填充”了它。
在代码中:std::vector<boost::shared_ptr<Foo>> data;
vector 是在堆栈上的函数内部创建的。我想使用 vector.at(k) 访问 vector 中的一些元素。返回的 shared_ptr 将被发送到另一个线程,我们称他为 T1。当 T1 仍在处理 shared_ptr 时,我的 vector 超出了范围。
在代码中:
void myFunction(){
<pre><code> //lets get my object
boost::shared_ptr<Foo> obj = data.at(k);
//emit it to Thread T1 (i am using QT)
emit sendObjToThread1(obj);
</code></pre>
}
我以前认为这不会有问题,但由于我的程序表现得很奇怪,我即将改变主意。 :) 为了澄清这一点,我现在在这个平台上问你。 :)
如果我的 vector 超出范围,我的对象将被销毁,对吗?如果是,我如何设法获得 shared_ptr 的深层拷贝(但不是它持有的对象)。只是提一下:我的应用程序是基于 QT 的。
感谢阅读。
最佳答案
没有。它返回一个引用。
boost::shared_ptr<Foo> obj = data.at(k);
但是在这个语句中,您通过创建 obj 来制作拷贝。
boost::shared_ptr<Foo>& obj = data.at(k);
^^^
现在没有复制。
编辑:
这条线呢?
sendObjToThread1(obj);
你传递的是引用还是值(value)?如果您通过引用传递给另一个线程,那么这是一个问题,因为 obj 的本地拷贝即将死亡(一旦函数返回)。因此,您必须按值传递 obj 以确保其他线程拥有自己的拷贝并适本地增加 shared_pointer 计数器。
关于c++ - 访问包含 boost::shared_ptr<CustomObj> 的 std::vector -> at() 是否返回共享指针的拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5198617/