c++ - 访问包含 boost::shared_ptr<CustomObj> 的 std::vector -> at() 是否返回共享指针的拷贝?

标签 c++ boost shared-ptr

我是第一次使用 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/

相关文章:

c++ - 我可以安全地移动 boost 变体吗?

c++ - 弱指针库实现C++

c++ - 将 shared_ptr 转换为常规指针

非对象类型的 C++ 智能指针?

c++ - 使用 Visual Studio 2013 的自定义编译器

c++ - 随机数生成器和线程安全

c++ - Durand-Kerner 方法求非线性方程的根

c++ - 数据文件放在哪里以便 Microsoft Visual C++ 2008 调试器可以找到它们?

c++ - 使用 boost::asio::basic_stream_socket::async_read_some 而不是 boost::asio::async_read 是否更有效?

C++ boost 示例 : Creating and Managing Threads (Compilation Error)