我正在测试一个递归函数,它可以释放链表的内存。我删除它后尝试打印列表的内容以确保它已被删除,但似乎无法测试节点是否已被删除,因为指针仍然存在。我在使用更简单的函数删除列表时也会遇到相同的错误。除非我在某个地方犯了错误,否则我的问题是:
有没有办法测试已删除的节点?
我的删除功能:
template <typename node>
void deleteList(node root) {
if (!root) {
return;
}
deleteList(root->next);
delete root;
}
我的打印列表功能:
template <typename node>
void printList(node root) {
node current = NULL;
if (root) {
current = root;
cout << "if (root) == true\n";
cout << "root is: " << root << "\n";
}
while (current) {
cout << current->in << "\n";
current = current->next;
}
}
如果在调用deleteList(node)后调用printList(node),printList会将if (root)
评估为true以及while (current)
,因此cout << current->in
会导致分段错误
答案 0 :(得分:3)
当你释放内存时,最好将指针设置为null(现代C ++中的nullptr
)。这样可以更轻松地测试以后是否释放该内存。这是防御性编程的一部分。
这将导致(!root)
检查在释放的内存上失败。对于所有动态分配的内存,您应该遵循这种做法,这样您就不会尝试使用无效指针。由于空指针导致崩溃比使代码看起来有效但实际上已损坏更好。
答案 1 :(得分:2)
delete
未将指针设置为nullptr
,您必须手动执行此操作:
template <typename node>
void deleteList(node& root) {
// ^
if (!root) {
return;
}
deleteList(root->next);
delete root;
root = nullptr; // <<<<<<<<<<<
}