Удаление из C ++ priority_queue - PullRequest
0 голосов
/ 22 марта 2019

Безопасно ли удалять элемент в std::priority_queue и извлекать его потом, или поп пытается сделать что-нибудь с ссылкой, кроме как отбросить ее?

  while(!priority_queue.empty()){
    delete priority_queue.top();
    priority_queue.pop();
  }

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

После разъяснения от OP о том, что очередь не содержит никаких указателей, только объекты:

Вам вообще не нужно вызывать delete.Просто звоните pop() только в вашем цикле.Контейнер занимается освобождением.

1 голос
/ 22 марта 2019

Так что эта страница полезна: http://www.cplusplus.com/reference/queue/priority_queue/pop/

То, что он говорит, - то, что объекты в очереди разрушены.

Однако, если на самом деле у объекта нет деструктора, который удаляет его содержимое, вы должны удалить его самостоятельно. Но это не ОО-программирование, это просто ленивое использование контейнера.

Обратите внимание: скажем, пара объектов, у которых есть свои деструкторы, будет правильно вызывать оба деструктора.

Так что, в общем, нет, вам не следует явно удалять объекты, но если вы лениво написали контейнер необработанных указателей или пар указателей, то вам придется это сделать, потому что вы не выиграете от вызова деструктора.

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