2012-06-08 51 views
0

对于一个类的赋值,我需要为我创建的链表创建一个析构函数。我做了一个叫做MakeEmpty的函数,我在析构函数里调用。它正确编制的第一次,但现在我得到瞬间崩溃,并错误说:如何正确地销毁链表?

表达:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)

有人可以帮助我弄清楚什么是错的?我运行了调试器并指出错误出现在代码中的位置。

​​

这是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

好友,您正在删除“p”,然后赋值给它...这可能是怎么回事! – Swanand

+0

@SwanandPurankar我想删除p指向的节点,然后将p前进到下一个节点,删除那个,直到它们全部消失为止 – Mike

+0

是的,我们知道了...但是您错过了一个小那里的事情......仔细检查你的代码......不要期待答案......这是你的功课! – Swanand

回答

0

您有编码错误...您需要:检查您的代码!

记下每个语句以及循环的每次迭代中所有变量的期望值。不要跳过任何步骤。这会让你的编码错误显而易见。

30年后,我在我的脑海里做了这件事..但我总是这样做,以确保我写的是正确的。这个习惯将在未来几年为您提供良好的服务。

3

由于它是一门功课,我不打算给解决方案,而是一个提示。

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

在这段时间,在列表中你开始/结束删除?为什么?

+0

好吧,删除将开始在列表中的第一个节点,因为p已初始化到此节点。并且删除将在最后一个节点结束,因为一旦前面命中空值,p留在最后一个节点。但我相信这个while循环能够正确地做到这一点,但显然它是可以接受的 – Mike