如何测试是否在C ++中删除了链表节点

时间:2016-06-04 02:47:42

标签: c++ linked-list

我正在测试一个递归函数,它可以释放链表的内存。我删除它后尝试打印列表的内容以确保它已被删除,但似乎无法测试节点是否已被删除,因为指针仍然存在。我在使用更简单的函数删除列表时也会遇到相同的错误。除非我在某个地方犯了错误,否则我的问题是:

有没有办法测试已删除的节点?

我的删除功能:

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会导致分段错误

2 个答案:

答案 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; // <<<<<<<<<<<
}