Итак, у меня есть связанный список, который создается правильно, связан правильно, но когда я пытаюсь освободить память, я не могу удалить ни один узел, список все еще существует.
Код для моего списка деконструктора:
void LL_User::free_memory() {
// TODO
LL_User_Node *currentNode;
currentNode = head;
while(currentNode) {
LL_User_Node *temp = currentNode;
currentNode = currentNode->next;
delete temp;
}
//cout << "LL_User::free_memory() is not implemented yet.\n";
}
LL_User::~LL_User() {
if(head == NULL) {
return;
}
free_memory();
}
И мой пользовательский класс имеет это для Vars и деконструктора:
User::User() {
username = "";
password = "";
first_name = "";
last_name = "";
profile_pic_filename = "";
birth_year = 0;
birth_month = 0;
birth_day = 0;
}
User::~User() {
//Nothing placed in body because strings and ints are dealt with by OS?
}
Код, как написано сейчас, имеет только один серьезный недостаток; Вы удаляете список, связанный с head
, но никогда не ставлю голову на NULL
, Любой, кто прикасается к этому с этого момента, запускает неопределенное поведение через указатель мусора.
Установите head в NULL, если вы стираете список следующим образом. В качестве альтернативы, так как вы знаете, head
должно быть NULL
после того, как это сделано в любом случае, отказаться от использования currentNode
совсем. Просто использовать head
сам как указатель, который идет по списку. Подумайте об этом некоторое время, и оно придет к вам.
Также, как написано, чек для (head == NULL
) не нужен в вашем деструкторе. Это уже проверено в вашем free_memory()
функционировать, как и должно быть.
Вы вручную освобождаете это, это то, что вы делаете неправильно. Используйте умный указатель, как мудрый человек, создайте программу, которая работает как человек, который хочет получать деньги за свое ремесло.