访问包含 boost::shared_ptr 的 std::vector -> at() 返回共享指针的副本吗?
我是 boost::shared_ptr 的新手,第一次使用它。我有一个包含 boost::shared_ptr 的 std::vector ,我用自定义类创建的对象“填充”了它。
在代码中: std::vector
该向量是在堆栈上的函数内部创建的。我想使用 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 的。
谢谢阅读。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不。它返回一个引用。
但在这个语句中,您通过创建 obj 来制作副本。
现在已经没有复制品了。
编辑:
这一行怎么样?
你传递的是参考还是价值?如果您通过引用传递给另一个线程,那么这是一个问题,因为 obj 的本地副本即将死亡(一旦函数返回)。因此,您必须按值传递 obj,以确保另一个线程拥有自己的副本并适当地增加共享指针计数器。
No. It returns a reference.
But in this statement you are making a copy by creating obj.
Now there are no copies made.
Edit:
What about this line?
Are you passing be reference or value? If you pass by reference to another thread then this is a problem as the local copy of obj is about to die (as soon as the function returns). So you must pass obj by value to make sure the other thread has its own copy and increments the shared_pointer counter appropriately.
请参阅
std::vector::at 的文档之一()
。它返回一个引用。只要您的emit sendObjToThread1(obj);
执行shared_ptr
的副本,您就是安全的。See one of the docs for
std::vector<T>::at()
. It returns a reference. As long as youremit sendObjToThread1(obj);
does a copy of theshared_ptr
you are safe.我认为你正在使用线程。去阅读本文并仔细检查所有相关内容以保证线程安全。确保您使用的是 pthreads 或无锁实现。
I think you're using threads. Go read this and double-check everything related to thread safety. Make sure you're using either the pthreads or lock-free implementation.