是否需要删除保存对象的“对”?

时间:2018-11-05 09:32:14

标签: c++ c++11 vector

我像这样配对了

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

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

std::vector<OrderPair> orderList;

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

2 个答案:

答案 0 :(得分:5)

当您的OrderPair被删除时,作为其一部分的Dish也将消失。当std::vector<OrderPair> orderList超出范围(在函数的末尾声明等等)时,其中的所有OrderPair以及其中的所有Dish也将消失。当您使用OrderPair擦除erase时,Dish就消失了。

  

当我不想删除碟子时,擦除功能就足够了   从内存中获取?

如果您呼叫erase,则该OrderPairDish将从内存中消失。如果这不是您想要的,则需要一个不同的数据结构。例如,如果OrderPair不包含Dish而是指向Dish的指针,则如下所示:

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

然后,您确实可以erase配对,并且Dish不会从内存中删除,只需对其进行引用即可。但是,仅凭这小段代码,就很难知道您的意图。

答案 1 :(得分:3)

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

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

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

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