在我的链表实现中,删除内部类deleteNode(Node*)
实例的辅助函数Node
通过VS 2015中的本地Windows调试器中的“触发断点”引发运行时错误我小心地匹配我的new
和delete
运营商。范围/参考是否发挥了我没有意识到的作用?
即使clear()
中存在逻辑错误且deleteNode()
已通过nullptr
,也不应抛出错误以删除nullptr
,然后分配{{ 1}}对自己吧?删除有什么问题?
nullptr
我删除了与错误无关的所有属性和方法。这个虚拟代码仍会抛出相同的错误。
答案 0 :(得分:5)
问题在于您的clear()
功能。您知道,认为由于您编写deleteNode
函数的方式,nullptr
之后所有节点都将clear
。遗憾的是,这不是真的。您将head
复制到current_node
,并且当删除时,head(即current_node)的副本会变为nullptr
,但head
仍为非空。稍后析构函数会再次尝试删除它。在已释放的内存上调用delete会导致未定义的行为。
要修复,请添加
head = nullptr;
在你的明确功能结束时
答案 1 :(得分:2)
delete操作符在什么上下文中抛出错误?
如果析构函数本身抛出,则delete
表达式可以抛出,或者抛出子对象的析构函数。但你应该避免投入析构函数。
如果尝试删除未指向有效对象的指针,则delete
表达式也可能具有未定义的行为。例外是nullptr
,可以安全删除。意外删除无效指针的典型原因是尝试删除两次相同的指针值,或者忘记初始化内存。未定义的behviour可能会导致任何错误,包括抛出错误。
删除有什么问题?
您要两次删除相同的指针。您可以通过检查调试器中的值来验证它。