c – delete操作符在什么上下文中抛出错误?
发布时间:2020-12-16 10:01:52 所属栏目:百科 来源:网络整理
导读:在我的链表实现中,删除内部类Node实例的helper函数deleteNode(Node *)通过在VS 2015中的Local Windows Debugger中“触发断点”引发运行时错误.我小心地匹配我的新手和删除操作符.范围/参考是否发挥了我没有意识到的作用? 即使clear()中存在逻辑错误并且dele
在我的链表实现中,删除内部类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; 在你的明确功能的最后 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |