Я не понимаю, что я делаю не так с моим перераспределением памяти

Итак, у меня есть связанный список, который создается правильно, связан правильно, но когда я пытаюсь освободить память, я не могу удалить ни один узел, список все еще существует.
Код для моего списка деконструктора:

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?
}

3

Решение

Код, как написано сейчас, имеет только один серьезный недостаток; Вы удаляете список, связанный с head, но никогда не ставлю голову на NULL, Любой, кто прикасается к этому с этого момента, запускает неопределенное поведение через указатель мусора.

Установите head в NULL, если вы стираете список следующим образом. В качестве альтернативы, так как вы знаете, head должно быть NULL после того, как это сделано в любом случае, отказаться от использования currentNode совсем. Просто использовать head сам как указатель, который идет по списку. Подумайте об этом некоторое время, и оно придет к вам.

Также, как написано, чек для (head == NULL) не нужен в вашем деструкторе. Это уже проверено в вашем free_memory() функционировать, как и должно быть.

4

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

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

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector