c – delete操作符在什么上下文中抛出错误?

在我的链表实现中,删除内部类Node实例的helper函数deleteNode(Node *)通过在VS 2015中的Local Windows Debugger中“触发断点”引发运行时错误.我小心地匹配我的新手和删除操作符.范围/参考是否发挥了我没有意识到的作用?

即使clear()中存在逻辑错误并且deleteNode()传递nullptr,它也不应该抛出错误删除nullptr,然后将nullptr分配给它自己呢?删除有什么问题?

class LinkedList {
public:
    LinkedList() : head(nullptr) {}
    ~LinkedList() { clear(); }

    void push_front() {
        head = createNode(head);
    }

    void clear() {
        Node* current_node = head;
        while (current_node != nullptr) {
            Node* next_node = current_node->next; // buffer
            deleteNode(current_node);
            current_node = next_node;
        }
    }

private:    
    struct Node {
        Node(Node* next)
            : next(next) {}
        Node* next;
    };
    Node* head;
    Node* createNode(Node* next) {
        return new Node(next);
    }
    void deleteNode(Node*& toDelete) {
        delete toDelete; // ***VS 2015 puts breakpoint here***
        toDelete = nullptr;
    }
};

int main() {
    auto A = LinkedList();
    A.push_front();
    A.clear();
    return 0;
}

删除了与错误无关的所有属性方法.这个虚拟代码仍会抛出相同的错误.

解决方法

问题在于clear()函数.你看,你认为由于你编写deleteNode函数的方式,所有节点在清除后都将为nullptr.遗憾的是,这不是真的.您将头部复制到current_node,并且头部的副本(即current_node)在被删除时变为nullptr,但head仍然是非null.稍后析构函数会再次尝试删除它.在已释放的内存上调用delete会导致Undefined Behavior.

要修复,请添加

head = nullptr;

在你的明确功能的最后

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...