【发布时间】:2018-07-22 04:43:39
【问题描述】:
所以我正在制作一个链接列表,除了列表的析构函数之外,它的所有内容都按照我的意愿工作:
PhoneList::~PhoneList()
{
PhoneNode *ptr = head;
while (ptr != NULL)
{
head = head->getNext();
delete ptr;
ptr = head;
}
}
当程序运行时,它会做我需要它做的所有其他事情,但是当它试图调用它并结束程序时,它似乎在析构函数上无限循环。这是我在这里的第一个问题,而且我对整个编程有点陌生,所以如果你需要查看我的更多程序代码来理解这个析构函数,我很乐意分享!
【问题讨论】:
-
它看起来还不错,尽管 IMO 的混乱程度略低:
while (head) {PhoneNode* to_remove = head; head = head->getNext(); delete to_remove;}。我认为您的错误除了带有格式错误列表的 dtor 之外的其他地方。仔细检查您的插入和删除功能。如果您发布这些插入和删除功能的一些代码,有些人可能会发现问题。无限循环很可能是由于列表节点未正确链接造成的。 -
我觉得它也应该有用。而且我也有同样的想法,但是将这段代码从析构函数中取出并留空就完全解决了这个问题。我觉得它必须是析构函数,因为它成功调用并执行了所有其他代码,直到它到达 main() 的末尾。我认为调试器也刚刚证实了这种怀疑,因为当我在它所在的程序部分中断时,它告诉我程序处于析构函数的 while 循环中。
-
我也很欣赏循环建议!喜欢看到让我的代码更干净的方法:)
-
留空可能会避免无限循环遍历列表,但问题很可能是由于列表格式错误。其他列表操作成功并不意味着它们使列表完好无损。例如,下一个指针之一可能指向垃圾内存,此时析构函数中的循环可能会无限循环。尝试分享一些用于插入和删除列表节点的代码——我认为我们应该能够发现其中任何一个问题。
-
你这傻鹅!!! :-D 完整程序中的析构函数有一个分号:
while (ptr != NULL);如果列表非空,这将导致无限循环。您没有在原始 sn-p 中包含分号(这很好)。
标签: c++ linked-list destructor dynamic-memory-allocation