2012-06-08 4 views
0

Для назначения класса мне нужно реализовать деструктор для объектов связанного списка, которые я создал. Я сделал функцию под названием MakeEmpty, которую я вызвал внутри деструктора. Он составлен правильно в первый раз, но теперь я получаю мгновенный сбой с сообщением об ошибке, говоря:Как правильно уничтожить связанный список?

Expression: _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)

Может кто-то помочь мне понять, что не так? Я запустил отладчик и указал, где он говорит, что ошибка в коде.

WORD::~WORD() 
{ 
cout << "Destructor Called"<<endl; 

(*this).MakeEmpty(); 
} 

И это функция

void WORD::MakeEmpty() 
{ 
alpha_numeric *p = (*this).front; 

if((*this).IsEmpty()) 
{ 
    cout <<"Already empty"<< endl; 
    return; 
} 

while(front != 0) 
{ 
    front = front -> next; 
    delete p;//<<<<---DEBUGGER SAYS ERROR HERE 
    p = front; 
} 
return; 
} 
+1

Buddy, вы удаляете «p», а затем присваиваете ему значение ... Как это возможно! – Swanand

+0

@SwanandPurankar Я хотел удалить узел, на который указывал p, затем переместить p на следующий узел, удалить его и так далее, пока они не исчезнут – Mike

+0

Да, мы получили его ... Но вам не хватает небольшой вещь там ... Проверьте свой код внимательно ... Не ждите ответа ... Это ваша домашняя работа! – Swanand

ответ

0

У вас есть ошибка кодирования ... вам нужно: Скамью проверить свой код!

Запишите ожидаемые значения всех переменных в каждом из операторов и через каждую итерацию цикла. Не пропустите никаких шагов. Это сделает вашу ошибку кодирования очевидной.

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

3

Поскольку это домашнее задание, я не собираюсь дать решение, а скорее намек MakeEmpty().

while(front != 0) 
{ 
    front = front -> next; 
    delete p;//<<<<---DEBUGGER SAYS ERROR HERE 
    p = front; 
} 

В этом случае, где в списке вы начинаете/завершаете удаление? И почему?

+0

ну, удаление начнется с первого узла в списке, потому что p был инициализирован этим узлом. И удаление закончится на последнем узле, потому что p останется на последнем узле после того, как фронт ударит нуль. Но я считаю, что в то время как цикл делает это правильно, но, по-видимому, он доцент – Mike