带有智能指针的 C++11 向量

Posted

技术标签:

【中文标题】带有智能指针的 C++11 向量【英文标题】:C++11 vector with smart pointer 【发布时间】:2021-12-26 15:27:05 【问题描述】:

我阅读了很多关于矢量现代用法的文档。

出现的一个常见情况是,“您可以将每个 push_back 替换为 emplace_back”。是真的吗?我不确定,事实是我不明白智能指针的想法。

那么,放置智能指针与将其推入向量有区别吗?

换句话说:

myVector.emplace_back(std::make_shared< XXX >(x, y, z));

VS

myVector.push_back(std::make_shared< XXX >(x, y, z));

我阅读了有关放置智能指针的评论,并在插入导致内存泄漏之前引发了可能的异常(低内存)。是真的吗? Memory leaking

最后,我希望能写出这样的东西:

myVector.emplace_back(x, y, z);

但我很确定,我可以忘记它。所以这就是为什么我在考虑使用智能指针安放的真正好处。

【问题讨论】:

为什么首先要将指针存储在向量中? @Raildex 有 许多 个有效的用例。 因为我想与应用程序的某些部分共享向量中的项目。但保留一个可以访问所有这些的地方。 @SébastienBémelmans 如果您能引用您阅读的评论,将会很有帮助。 你在使用多态吗?如果没有,您可能只是将对象存储在向量中,而不是存储指针。 【参考方案1】:

问题开头的emplace_backpush_back 之间没有区别,它们都提供了一个prvalue std::shared_ptr&lt;XXX&gt;,它将传递给向量元素的移动构造函数。

如果myVector 持有std::shared_ptr&lt;XXX&gt;,则您不能myVector.emplace_back(x, y, z);,因为没有std::shared_ptr&lt;XXX&gt; 的构造函数接受这些参数。如果它是一个std::vector&lt;XXX&gt;,你可以这样做,这将在原地构造一个XXX

然而,其中大部分是没有实际意义的,因为复制省略意味着允许实现在适当的位置构造共享指针。

【讨论】:

以上是关于带有智能指针的 C++11 向量的主要内容,如果未能解决你的问题,请参考以下文章

智能指针11

智能指针11

智能指针11

详解C++11智能指针

移动智能指针两次与复制

C++11 unique_ptr智能指针详解