C++ 是否有一个;配对;需要删除哪个保存对象?

C++ 是否有一个;配对;需要删除哪个保存对象?,c++,c++11,vector,C++,C++11,Vector,我做了一双这样的 typedef std::pair<int, Dish> OrderPair; typedef std::pair OrderPair; 当盘子是一个物体时。 我得到了一个有序对向量: std::vector<OrderPair> orderList; std::向量订单列表; 假设我想从向量中删除一对,当我不想从内存中删除碟片时,擦除功能是否足够?我认为答案是肯定的,因为创建一对并不在堆中,因此我不需要释放任何内存。如果我错了,请告诉我。当您的

我做了一双这样的

typedef std::pair<int, Dish> OrderPair;
typedef std::pair OrderPair;
当盘子是一个物体时。 我得到了一个有序对向量:

std::vector<OrderPair> orderList;
std::向量订单列表;

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

当您的
订单对被删除时,作为其一部分的
盘也不见了。当
std::vector orderList
超出范围(在其中声明的函数结束等)时,其中的所有
OrderPair
以及其中的所有
Dish
也都将消失。当您使用
erase
擦除
OrderPair
时,该
Dish
将消失

当我不想删除碟片时,擦除功能是否足够 凭记忆

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

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

然后你确实可以
删除那一对,而
碟子也不会从内存中删除,只会删除对它的一次引用。但是,仅使用这一小段代码,很难知道您的意图。

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

在您的例子中,您将Dish对象本身推入到该对中,而不是指向动态分配的指针

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

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

只有使用
new
分配的实例需要使用
delete
删除。Q可能重复。何时使用
delete
?从来没有。您将需要的每一次
删除
都已封装在
shared_ptr
和/或
unique_ptr
中。(如果你正在编写自己的智能指针,你可能需要‘删除’,但是你不会问这个问题)。@你可能也想考虑一下智能指针,这里所有的唯一、共享和损坏都可能损坏。这完全取决于您的场景,我们不知道细节,因为您没有提供它们。原始指针也可以适用。@Blaze,我不能更改这对指针的签名,因为它是我收到的代码的一部分。有了这个障碍,“我能得到的最好的选择是什么?”?创建一份碟子副本并将其放入配对?在这种情况下,您说过擦除该对(向量的擦除功能)将从内存中删除复制的对象是吗?没错,如果您将
Dish
的副本放入该对,然后删除该对,则只有副本消失。