Это не дубликат вопроса с похожим названием. Это связано с ООП, вызовами new и delete.
Я пытаюсь написать функцию, которая будет выполнять итерацию в конце моего связанного списка, а затем удалять выделенную память в куче последнего узла.
Вот мой код:
void LinkedList::delete_back(){
if(head != NULL){
ListNode *end = head;
while(end->next != NULL)
end = end->next;
delete end;
}
size--;
}
И вот мои определения классов:
class ListNode{
public:
Item data;
ListNode *next;
};
class LinkedList{
private:
ListNode *head;
int size;
public:
LinkedList();
~LinkedList();
bool empty();
void insert_front(Item i);
void insert_back(Item i);
void delete_front();
void delete_back();
void print();
};
Anddddd ..... это проблема, я получаю спам с сообщениями об ошибках, подобными этому, от valgrind, некоторые заявляют о недопустимом чтении размера 4, другие сообщают о недопустимом чтении размера 8:
==4385== Invalid read of size 4
==4385== at 0x400CAA: LinkedList::print() (in /home/jon/jball2_lab06/linkedlist)
==4385== by 0x400EDD: main (in /home/jon/jball2_lab06/linkedlist)
==4385== Address 0x5a04f30 is 0 bytes inside a block of size 16 free'd
==4385== at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4385== by 0x400C5E: LinkedList::delete_back() (in /home/jon/jball2_lab06/linkedlist)
==4385== by 0x400E99: main (in /home/jon/jball2_lab06/linkedlist)
Я опубликую остальные ошибки, если это поможет, но мне не хочется нажимать пробел 4 раза на 50 строках, если мне это не нужно. Кто-нибудь знает, что это может быть? Что я делаю неправильно?
ОБНОВЛЕНИЕ ----------------------- Я отредактировал код следующим образом:
void LinkedList::delete_back(){
if(head != NULL){
ListNode *end = head;
ListNode *prev_end;
while(end->next != NULL){
prev_end = end;
end = end->next;
}
prev_end->next = NULL;
if(end != NULL) delete end;
size--;
}
}
Теперь я получаю больше недопустимых чтений ошибок размера 8/4 и недопустимых ошибок бесплатного/удаления
==5294== Invalid free() / delete / delete[] / realloc()
==5294== at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
и это:
==5294== Use of uninitialised value of size 8
==5294== at 0x400C3D: LinkedList::delete_back() (in /home/jon/jball2_lab06/linkedlist)
==5294== by 0x400EEC: main (in /home/jon/jball2_lab06/linkedlist)
Вот тестовый код, который я использую:
for(Item i = 50; i < 100; i++){
ll.insert_back(i);
cout << "Inserted [" << i << "] in back.\n";
}
ll.print();
for(int i = 0; i < 50; i++)
ll.delete_back();
cout << "Removed 50 elements from the back.\n";
ll.print();
Это происходит, когда последний элемент удаляется из списка с помощью delete_back().
ОБНОВИТЬ-------------------------
Проблема заключалась в том, что если end->next равно null, то цикл while никогда не будет выполняться, prev_end никогда не будет инициализирован. Опубликован ответ с реализованными исправлениями.