【问题标题】:Vector of pointers vs Vector of objects vs Vector on the heap指针向量 vs 对象向量 vs 堆上的向量
【发布时间】:2021-07-15 14:15:36
【问题描述】:

以下示例的用例是什么:-


vector<Object> collection;

vector<Object> *collection = new vector<Object>

vector<Object*> collection;(creating the object on the heap)

我什么时候需要在对象向量上创建指针向量,并且向量(或任何 STL 容器)不分配堆上的元素?

【问题讨论】:

  • new vector&lt;Object&gt; 没用。 std::vector 不应该直接在堆上分配,因为std::vector 通常在堆上管理一些内存,它只保存三个指向托管内存的指针。其他版本很有用。第一个应该很明显,最后一个在你的书中读到了多态性。
  • @MarekR: std::shared_ptr&lt;std::vector&lt;T&gt;&gt; 有它的用法(因为任何带有Ustd::shared_ptr&lt;U&gt; 都包含std::vector&lt;T&gt;)。即使它更罕见。

标签: c++ oop c++11 vector memory-management


【解决方案1】:

通常,

std::vector<Object> collection; // Always use this if possible

您应该始终将对象直接存储为std::vector 中的值。 vector 将其内容动态存储在堆上。

这个,

std::vector<Object>* collection = new vector<Object>; // NEVER use this

我想不出任何有用的理由。 vector 已经将它的元素动态存储在堆上,如果需要,您可以使用std::movestd::swap 轻松、廉价地移动整个内容。

您可能需要做的是有几个组件来管理向量的生命周期。在那种情况下,std::shared_ptr 可能是合适的:

auto collection = std::make_shared<std::vector<Object>>(); // possible

在各种情况下都可能需要最后一个。例如,您可能需要使用不同标准排序的另一个向量的单独“视图”:

std::vector<Object> collection; 
std::vector<Object*> collection_view; // avoid

但是,这可能很危险,因为指针很容易失效,尤其是在指向另一个 vector 的元素时。如果您需要这样的东西,请尝试将所有数据封装在一个类中。

如果您想访问 vector 多态的元素,则更有可能需要。在这种情况下,vector 将负责删除对象,并应使用std::unique_ptr 来确保正确删除:

std::vector<std::unique_ptr<Object>> collection; // Polymorphism?

多态需要通过指针或引用访问对象。

可能还有其他可能性,您无法完全概括。但这些都是常见的经验法则。

【讨论】:

    【解决方案2】:

    你几乎从不想要一个:

    vector<Object> *collection = new vector<Object>
    

    std::vector 确实将其元素存储在堆上。动态创建向量本身并没有带来明显的好处,而是带来了复杂性。


    只有在极少数情况下,原始指针向量才是您真正需要的。

    vector<Object*> collection;(creating the object on the heap)
    

    当你需要指针而不需要向量时,你确实需要一个指针向量。例如,当Object 是多态类型时。虽然那时您会将智能指针存储在向量中,而不是原始指针。

    std::vector< std::shared_ptr<Object> > collection; // shared ownership
    std::vector< std::unique_ptr<Object> > colleciton; // the vector is the only owner
    

    只有当向量中的指针不参与实际Objects 的所有权时,您才可能需要原始指针向量。 (简单来说:所有权 = 谁负责管理Objects 的生命周期)。


    适合所有情况的大约 99% 的 goto 解决方案是一个

    vector<Object> collection;
    

    【讨论】:

    • 使用多态时可以使用最后一个。
    • @MarekR vector&lt;unique_ptr&lt;Object&gt;&gt; 在这种情况下。
    • @MarekR 是的,它已经在里面了,我试着让它更清楚
    • @largest_prime_is_463035818 但是当你在向量中添加对象时,它不会复制对象或移动对象吗?
    • @MohammadHussein 如果可能的话,您可以通过emplace 在向量中直接创建元素。如果向量不应该拥有对象,您需要决定谁拥有它们以及所有权是否共享
    猜你喜欢
    • 2011-10-01
    • 2011-02-11
    • 1970-01-01
    • 2011-12-19
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多