【发布时间】:2020-09-28 02:16:46
【问题描述】:
我正在用 C++ 编写一个单链表,当在一个包含多个节点的列表上调用我的单链表的析构函数时,它会导致段错误。
我正在对我的链表类运行测试以确保它正常运行,并且在测试 PushFront 方法时遇到了问题。当我从测试函数中删除delete list 行时,我意识到析构函数导致了段错误,并且它运行良好而没有段错误(PushFront 测试函数只是一系列测试函数中的一个函数,用于测试链表。删除删除行后,调用这一系列测试函数的测试程序完美执行,但删除行导致段错误。
这是链表的析构函数(带有用于调试目的的 cout 语句):
// CSingleLinkedList Destructor
CSingleLinkedList::~CSingleLinkedList()
{
std::cout << "In Destructor" << std::endl;
CSingleLinkedList::CSingleLinkedNode* temp = head_;
std::cout << "temp = " << temp << std::endl;
while(temp != nullptr)
{
CSingleLinkedList::CSingleLinkedNode* toDelete = temp;
temp = temp->GetNext();
std::cout << "toDelete = " << toDelete << std::endl;
std::cout << "temp = " << temp << std::endl;
delete toDelete;
}
}
这是链接节点的析构函数(它只有数据成员 value_(一个 int)和 next_(指向下一个 CSingleLinkedNode 的指针):
// CSingleLinkedNode Destructor
CSingleLinkedList::CSingleLinkedNode::~CSingleLinkedNode()
{
delete next_;
}
这是我正在运行以测试 PushFront 功能的测试功能:
void TestListPushFront()
{
CSingleLinkedList* list = new CSingleLinkedList();
list->PushFront(1);
assert(list->GetFrontValue() == 1);
assert(list->GetBackValue() == 1);
assert(list->GetSize() == 1);
list->PushFront(2);
list->PushFront(3);
assert(list->GetFrontValue() == 3);
assert(list->GetBackValue() == 1);
assert(list->GetSize() == 3);
std::cout << "TestListPushFront Passed!" << std::endl;
delete list;
}
这是我在运行函数时看到的痕迹:
TestListPushFront Passed!
In Destructor
temp = 0x55ce050332e0
toDelete = 0x55ce050332e0
temp = 0x55ce050332c0
toDelete = 0x55ce050332c0
temp = 0x55ce050332a0
Segmentation fault
任何人对为什么会发生此段错误有任何想法吗?
【问题讨论】:
-
这是一组非常好的诊断信息。您已经跟踪了循环的进度并记录了即将删除的地址。但是,您错过了节点析构函数中
delete之前的诊断。像std::cout << "A node is deleting " << next_ << "." << std::endl;这样的东西是合理的和信息丰富的。 (根据 Remy 的回答,您可能已经意识到这一点,但我仍然认为我会提到它。)
标签: c++ linked-list segmentation-fault singly-linked-list