советы по управлению памятью при использовании STL priority_queue

Я пытаюсь адаптироваться от Java к C ++ и не уверен в правильном способе управления памятью, когда я выталкиваю () элемент из STL priority_queue.

Должен ли я использовать delete для очистки элементов, удаленных из очереди, которые мне больше не нужны? Если так, то как? Если нет, то почему нет?

Я написал небольшую программу, чтобы научиться использовать priority_queue (код ниже). В этой программе нет ничего страшного, если есть утечка памяти, потому что она такая маленькая и быстро заканчивается. Но я хочу узнать, как правильно делать вещи, чтобы я мог написать программу, которая правильно обрабатывает гораздо большие очереди без утечек памяти.

Вещь, которую я не понимаю, состоит в следующем: top () возвращает ссылку, а не указатель. Но я не могу использовать удаление ссылки, не так ли?

Может ли кто-нибудь указать мне правильное направление здесь?

———————

struct PathCost{
int dest;
int cost;
PathCost(int _dest, int _cost){
dest = _dest;
cost = _cost;
}
bool operator<(PathCost other) const;
bool operator>(PathCost other) const;
};

bool PathCost::operator<(PathCost other) const{
return cost < other.cost;
}
bool PathCost::operator>(PathCost other) const{
return cost > other.cost;
}int main(){

PathCost pc = PathCost(1, 2);
pc = PathCost(3, 4);
PathCost* pcp = new PathCost(5, 6);
delete pcp;

priority_queue<PathCost,
vector<PathCost>,
greater<vector<PathCost>::value_type> > tentativeQ;

cout << "loading priority queue ...\n";
tentativeQ.push(PathCost(8, 88));
tentativeQ.push(PathCost(5, 55));
tentativeQ.push(PathCost(7, 77));
tentativeQ.push(PathCost(4, 44));

cout << "\nlist items on queue in priority order ...\n";
while (!tentativeQ.empty()){
pc = tentativeQ.top();
cout << "dest:" << pc.dest << " cost:" << pc.cost << endl;
tentativeQ.pop();
/* DO I NEED TO DO MEMORY CLEANUP AT THIS POINT? */
}
}

1

Решение

Должен ли я использовать delete для очистки элементов, удаленных из очереди, которые мне больше не нужны? Если так, то как? Если нет, то почему нет?

Вам не нужно выполнять какую-либо очистку, потому что PathCost объекты. Когда их удаляют из очереди, их деструктор вызывается автоматически в соответствии с правилами языка.

За кулисами история может быть несколько сложнее. Вставка элемента в структуру данных priority_queue, как правило, приводит к динамическому выделению копии этого объекта. Но распределение и перераспределение ресурсов осуществляется базовой структурой данных (по умолчанию std::vector) так что вам не нужно беспокоиться об управлении памятью. Стандартные библиотечные контейнеры и контейнерные адаптеры, как говорят, имеют семантика значения.

Вещь, которую я не понимаю, состоит в следующем: top () возвращает ссылку, а не указатель. Но я не могу использовать удаление ссылки, не так ли?

priority_queue сказано своя элементы, которые он содержит, поэтому, если вы берете ссылку на один из его элементов, вы не можете удалить его. На самом деле, вы не можете знать, нужно ли его вообще удалять или нет. Кроме того, хотя у вас есть доступ к ссылкам на элементы в очереди, вы не обязаны хранить ссылки на эти элементы. Вы также можете сделать свою собственную копию:

const PathCost& pRef = tentativeQ.top(); // take constant reference to top element
PathCost p = tentativeQ.top(); // make copy of last element

В первом случае вы должны быть осторожны, чтобы не использовать эту ссылку после того, как верхний элемент был удален посредством вызова pop(),

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]