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
的副本放入该对,然后删除该对,则只有副本消失。