【问题标题】:does a "pair" which holds object needs to be deleted?是否需要删除包含对象的“对”?
【发布时间】:2018-11-05 09:32:13
【问题描述】:

我做了一双这样的

typedef std::pair<int, Dish> OrderPair;

当 Dish 是一个对象时。 我得到了一个 OrderPair 向量:

std::vector<OrderPair> orderList;

假设我想从向量中删除一对,当我不想从内存中删除这道菜时,擦除功能是否足够?我认为答案是肯定的,因为创建对不是坐在堆中,因此我不需要释放任何内存。如果我错了,请告诉我。

【问题讨论】:

  • 只有使用new分配的实例才需要使用delete删除。
  • When to use "delete"?的可能重复
  • 问。我什么时候使用delete? A. 从不。您将需要的每个delete 都已封装在shared_ptr 和/或unique_ptr 中。 (如果您正在编写自己的智能指针,您可能需要“删除”,但您不会问这个问题)。

标签: c++ c++11 vector


【解决方案1】:

当您的OrderPair 被删除时,作为其中一部分的Dish 也将消失。当std::vector&lt;OrderPair&gt; orderList 超出范围(声明它的函数的结尾等)时,所有OrderPair 内的所有Dish 也都消失了。当您使用erase 擦除OrderPair 时,那个Dish 就消失了。

当我不想删除菜品时,擦除功能是否足够 凭记忆?

如果你调用erase,那么OrderPairDish 就会从内存中消失。如果这不是你想要的,你需要一个不同的数据结构。例如,如果OrderPair 不包含Dish,而是一个指向Dish 的指针,如下所示:

typedef std::pair<int, Dish*> OrderPair;

那么你确实可以erase 那对并且Dish 不会从内存中删除,只是对它的一个引用。但是只有这么小的代码 sn-p,很难知道你的意图。

【讨论】:

  • @Mr.OY 您可能还想在这里考虑智能指针,所有 uniquesharedweak可能在这里有用。这完全取决于您的情况,我们不知道细节,因为您没有提供它们。原始指针也可以适用。
  • @Blaze,我无法更改该对的签名,因为它是给我的代码的一部分。有了这个障碍,'我得到的最好的选择是什么?创建一个菜的副本并将其设置为对?在那种情况下,您说擦除该对(向量的擦除函数)将从内存中删除复制的对象是吗?
  • 没错,如果您将Dish 的副本放入该对并稍后删除该对,那么只有副本消失了。
【解决方案2】:

只有使用 new 或 malloc 显式动态分配的对象才需要使用 delete 或 free 显式删除。堆内存用于动态分配。

在您的情况下,您将 Dish 对象本身推入对中,而不是指向动态分配的指针。

>typedef std::pair <int, Dish> OrderPair;

因此,Dish 对象的范围绑定到 pair 对象的范围。当使用擦除方法擦除向量中的对时,该对以及 Dish 对象也会被销毁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2022-11-09
    • 1970-01-01
    • 2014-09-19
    • 2020-06-07
    相关资源
    最近更新 更多