是否需要删除包含对象的"pair"?

does a "pair" which holds object needs to be deleted?

本文关键字:pair 对象 包含 删除 是否      更新时间:2023-10-16

我做了一对这样的

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

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

std::vector<OrderPair> orderList;

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

当您的OrderPair被删除时,作为其中一部分的Dish也消失了。当std::vector<OrderPair> orderList超出范围(声明它的函数的结束等)时,所有OrderPair,因此其中的所有Dish也都消失了。当您使用erase擦除OrderPair时,该Dish就消失了。

当我不想删除菜肴时,擦除功能就足够了 凭记忆?

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

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

然后,您确实可以erase该对,并且Dish不会从内存中删除,只是对它的引用。但是只有这么小的代码片段,就很难知道你的意图。

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

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

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

因此,Dish 对象的作用域绑定到对对象的作用域。当使用擦除方法擦除矢量中的对时,该对和 Dish 对象也会被销毁。