Ошибка памяти с циклически связанным списком: освобожденный указатель не выделен

Программа запускается и тест завершается успешно, но между списком и результатом теста я получаю следующее: assignment_2.2 (10729,0x7fff78db0300) malloc: * ошибка для объекта 0x7fb132d00000: освобожденный указатель не выделен
*
установить точку останова в malloc_error_break для отладки
Любая идея, как я могу это исправить?

main.cpp

#include "OLinkedList.h"
using namespace std;

int main(int argc, char** argv) {
OLinkedList CircleList;
CircleList.fillList(0);
CircleList.prntList();
CircleList.OTest();
return 0;
}

OLinkedList.h

#ifndef OLINKEDLIST_H
#define OLINKEDLIST_H

#include <iostream>
#include <iomanip>
using namespace std;

class OLinkedList{
private:    struct Link{
int data;
Link *next;
};
Link *head;
Link *tail;
public:     OLinkedList(){head = nullptr; tail = nullptr;};
~OLinkedList();
void fillList(int);
void prntList();
void OTest();

};

//Destructor for Class used to delete memory of list
OLinkedList::~OLinkedList(){
Link *linkPtr = head;
Link *nextPtr;

//traverses to the end of the list to delete memory
do
{
nextPtr = linkPtr->next;
delete linkPtr;
linkPtr = nextPtr;
}while(linkPtr!= nullptr);
}

//
void OLinkedList::fillList(int size){
Link *front = new Link; //create first link
head = front; //set first link = to traversal
head->data = size++;         //Fill the front with data
head->next = nullptr;     //Point the front to no where

Link *temp = head;
do{
Link *end = new Link;   //Create a new link
end->data = size++;     //Fill with data
end->next = nullptr;       //Point to no where
temp->next=end;//Previous link will point to the end
temp=end;  //Now this has become previous link
tail = end;
tail->next = head;
}while(size < 10);          //Repeat until filled

}

void OLinkedList::prntList(){
Link *linkPtr;

linkPtr = head;
int i = 0;
do{
cout<<"  "<<setprecision(3)<<linkPtr->data;
linkPtr = linkPtr->next;
i++;
}while(i < 10);
}

//Used to prove list is circular
void OLinkedList::OTest(){
Link *linkPtr = tail->next;
cout<<"\nAfter "<<tail->data<<" is "<<linkPtr->data;
}
#endif /* OLINKEDLIST_H */

0

Решение

Когда вы устанавливаете tail-> рядом с головой, вы создаете круговой связанный список, как и предполагалось. Ваш цикл do while должен проверять linkPtr! = Head, а не nullptr, так как вы делаете двойное освобождение на голове. Это связано с тем, что удаление указателя не приводит к аннулированию любой переменной, ранее указывающей на него, поэтому ваш цикл в конечном итоге вернется к заголовку.

На самом деле, если бы не двойное освобождение, ваш код пошел бы в бесконечный цикл.

0

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

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

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