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

发布于 2024-10-20 18:30:15 字数 756 浏览 4 评论 0 原文

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

在代码中: std::vector> 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 的。

谢谢阅读。

i am new to boost::shared_ptr using it the first time now. I have a std::vector containing boost::shared_ptr which i "filled" with objects created from a custom class.

In Code: std::vector<boost::shared_ptr<Foo>> data;

The vector is created inside a function on the stack. I want to access some elements inside my vector using vector.at(k). The retured shared_ptr will be send to another thread, lets call him T1. My vector runs out of scope while T1 is still processing the shared_ptr.

In Code:


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);

}

I previously thought this would give no problem, but since my program is acting very strange, i am about to changing my mind. :) To clarify this i am asking you on this platform now. :)

Is it right, that my object will be destroyed if my vector runs out of scope? If yes, how can i manage to get a deep copy of the shared_ptr (but not the object it holds). Just to have mentioned it: My application is based on QT.

Thx for reading.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

宁愿没拥抱 2024-10-27 18:30:15

不。它返回一个引用。

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

但在这个语句中,您通过创建 obj 来制作副本。

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

现在已经没有复制品了。

编辑:

这一行怎么样?

sendObjToThread1(obj);

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

No. It returns a reference.

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

But in this statement you are making a copy by creating obj.

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

Now there are no copies made.

Edit:

What about this line?

sendObjToThread1(obj);

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.

苦妄 2024-10-27 18:30:15

请参阅 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 your emit sendObjToThread1(obj); does a copy of the shared_ptr you are safe.

眼眸里的那抹悲凉 2024-10-27 18:30:15

我认为你正在使用线程。去阅读本文并仔细检查所有相关内容以保证线程安全。确保您使用的是 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文