«пару», которая содержит объект, нужно удалить? - PullRequest
0 голосов
/ 05 ноября 2018

Я сделал пару, как это

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

когда блюдо является объектом. и я получил вектор OrderPair:

std::vector<OrderPair> orderList;

при условии, что я хочу удалить одну пару из вектора, достаточно ли функции стирания, если я не хочу удалять блюдо из памяти? Я думаю, что ответ - да, потому что создание пары - это не куча, и поэтому мне не нужно освобождать память. пожалуйста, скажите мне, если я ошибаюсь.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Только объекты, которые явно выделяются динамически - с использованием new или malloc, должны быть явно удалены с помощью delete или free. Память кучи используется для динамического распределения.

В вашем случае вы помещаете сам объект Dish в пару, а не указатель, указывающий на динамическое размещение.

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

Таким образом, область действия объекта Dish связана с областью действия парного объекта. Когда пара в векторе стирается с помощью метода стирания, пара и вместе с ней объект Dish тоже уничтожаются.

0 голосов
/ 05 ноября 2018

Когда ваш OrderPair будет удален, то Dish, который является его частью, также исчезнет. Когда std::vector<OrderPair> orderList выходит из области видимости (конец функции, в которой он был объявлен и т. Д.), Тогда все OrderPair внутри и, следовательно, все Dish в нем также исчезают. Когда вы стираете OrderPair, используя erase, то Dish исчезает.

достаточно ли функции стирания, когда я не хочу удалять блюдо из памяти?

Если вы позвоните erase, тогда этот OrderPair и, следовательно, Dish исчезнет из памяти. Если это не то, что вам нужно, вам нужна другая структура данных. Например, если OrderPair не содержит Dish, а указатель на Dish, например:

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

Тогда вы действительно можете erase, чтобы эта пара и Dish не были удалены из памяти, только одна ссылка на нее. Но с помощью этого небольшого фрагмента кода трудно понять ваши намерения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...