Если вас беспокоит память, я настоятельно рекомендую научиться работать с Valgrind http://valgrind.org/. Это отличный инструмент.Valgrind делит утечки памяти на 3 категории:
- «определенно потерян» - указатель на динамически распределенную память потерян, и нет никакого способа восстановить ее
- «возможно потерян» - указатель надинамически распределенная память указывает на внутреннюю часть блока и может быть не связана
- «все еще достижимо» - указатель на динамически распределенную память все еще существует, но память никогда не освобождалась в конце выполнения программ
Запуск Valgrind также очень прост.Вот ссылка на руководство пользователя http://valgrind.org/docs/manual/manual.html. Некоторые полезные флаги при запуске valgrind:
--leak-check=<no|summary|yes|full>
--show-reachable=<no|yes>
Теперь я бы удалил узел из двусвязного списка:
// if the node to be removed is the head node
if (nodeToRemove->prev == NULL) {
// reassign the head node pointer
start_ptr = nodeToRemove->next;
} else {
// correct previous node pointer
nodeToRemove->prev->next = nodeToRemove->next;
}
// if the node to be removed node is the tail node
if (nodeToRemove->next == NULL) {
// reassign the tail node pointer
end_ptr = nodeToRemove->prev;
} else {
// correct next node pointer
nodeToRemove->next->prev = nodeToRemove->prev;
}
// deallocate memory
delete(nodeToRemove);
nodeToRemove = NULL;
Просто объявите node *end_ptr = NULL;
после того, как вы объявите start_ptr
и когда вы добавите узел в список, убедитесь, чтоend_ptr всегда указывает на конец списка ... и если вы добавляете в конец списка, это легко ... просто укажите end_ptr на добавляемый узел.
Вы также можете оставить указатель на хвост, если вам всегда нужно удалить последний узел.Поэтому, когда у вас есть узел, который вы хотите удалить, я просто проверяю, является ли он узлом head / tail, переназначаю указатели next / prev и освобождаю память.
Кстати ... Я взял это из моего Cреализации, поэтому, если синтаксис выключен, я прошу прощения ... но логика есть.
Надеюсь, что помогает.