带有智能指针的 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_back
和push_back
之间没有区别,它们都提供了一个prvalue std::shared_ptr<XXX>
,它将传递给向量元素的移动构造函数。
如果myVector
持有std::shared_ptr<XXX>
,则您不能myVector.emplace_back(x, y, z);
,因为没有std::shared_ptr<XXX>
的构造函数接受这些参数。如果它是一个std::vector<XXX>
,你可以这样做,这将在原地构造一个XXX
。
然而,其中大部分是没有实际意义的,因为复制省略意味着允许实现在适当的位置构造共享指针。
【讨论】:
以上是关于带有智能指针的 C++11 向量的主要内容,如果未能解决你的问题,请参考以下文章