【问题标题】:How to correctly destruct linked-list?如何正确破坏链表?
【发布时间】:2012-06-12 04:27:43
【问题描述】:

对于一个类分配,我需要为我创建的链表对象实现一个析构函数。我创建了一个名为MakeEmpty 的函数,我在析构函数中调用了它。它第一次编译正确,但现在我立即崩溃并显示错误消息:

表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

有人可以帮我找出问题所在吗?我运行了调试器并指出了错误在代码中的位置。

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

(*this).MakeEmpty();
}

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

【问题讨论】:

  • 哥们,你正在删除“p”,然后给它赋值……这怎么可能!!
  • @SwanandPurankar 我想删除 p 指向的节点,然后将 p 前进到下一个节点,删除那个,依此类推,直到它们全部消失
  • 是的,我们知道了...但是您遗漏了一个小东西...仔细检查您的代码...不要期望答案...这是您的作业!
  • 循环对我来说看起来不错。您应该发布一个您使用 WORD 并且它崩溃的最小示例。您是否为您的两个类编写了正确的复制构造函数和赋值运算符?
  • @MikeGordon:这几乎肯定是问题所在。如果您没有复制构造函数,那么复制 WORD 会给您两个指向同一个列表的对象。两个析构函数都会尝试删除该列表,从而导致未定义的行为。如果你有一个管理资源的类,那么你需要考虑Rule of Three

标签: c++ linked-list destructor


【解决方案1】:

由于是作业,我不打算给出解决方案,而是给出提示。

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

此时,您在列表的哪个位置开始/结束删除?为什么?

【讨论】:

  • 好吧,删除将从列表中的第一个节点开始,因为 p 已初始化为该节点。并且删除将在最后一个节点结束,因为一旦 front 命中 null,p 就会留在最后一个节点。但我相信这个 while 循环可以正确地做到这一点,但显然它没有
【解决方案2】:

您有一个编码错误...您需要:对您的代码进行基准测试!

写下每个语句和循环的每次迭代中所有变量的预期值。不要跳过任何步骤。这将使您的编码错误显而易见。

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

【讨论】:

    猜你喜欢
    • 2018-01-05
    • 1970-01-01
    • 2014-01-04
    • 2015-06-12
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多