在哪个上下文中,delete运算符会抛出错误?

时间:2016-02-23 07:28:31

标签: c++ inner-classes delete-operator

在我的链表实现中,删除内部类deleteNode(Node*)实例的辅助函数Node通过VS 2015中的本地Windows调试器中的“触发断点”引发运行时错误我小心地匹配我的newdelete运营商。范围/参考是否发挥了我没有意识到的作用?

即使clear()中存在逻辑错误且deleteNode()已通过nullptr,也不应抛出错误以删除nullptr,然后分配{{ 1}}对自己吧?删除有什么问题?

nullptr

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

2 个答案:

答案 0 :(得分:5)

问题在于您的clear()功能。您知道,认为由于您编写deleteNode函数的方式,nullptr之后所有节点都将clear。遗憾的是,这不是真的。您将head复制到current_node,并且当删除时,head(即current_node)的副本会变为nullptr,但head仍为非空。稍后析构函数会再次尝试删除它。在已释放的内存上调用delete会导致未定义的行为。

要修复,请添加

 head = nullptr;

在你的明确功能结束时

答案 1 :(得分:2)

  

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

如果析构函数本身抛出,则delete表达式可以抛出,或者抛出子对象的析构函数。但你应该避免投入析构函数。

如果尝试删除未指向有效对象的指针,则delete表达式也可能具有未定义的行为。例外是nullptr,可以安全删除。意外删除无效指针的典型原因是尝试删除两次相同的指针值,或者忘记初始化内存。未定义的behviour可能会导致任何错误,包括抛出错误。

  

删除有什么问题?

您要两次删除相同的指针。您可以通过检查调试器中的值来验证它。