在链接列表的实现中,删除内部类deleteNode(Node*)实例的助手函数Node通过在VS 2015中“触发本地Windows中的断点”抛出运行时错误。我正在小心地匹配我的new和delete操作符。范围/引用是否起到了我没有意识到的作用?
即使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;
}我已经删除了与错误无关的所有属性和方法。这个虚拟代码仍然抛出相同的错误。
发布于 2016-02-23 07:43:59
delete操作符在什么上下文中抛出错误?
如果析构函数本身抛出,则可以抛出delete表达式,也可以抛出子对象的析构函数。但你应该避免抛出破坏者。
如果尝试删除不指向有效对象的指针,则delete表达式也可能具有未定义的行为。nullptr是一个例外,它可以安全地删除。不小心删除无效指针的典型原因是尝试删除同一指针值两次,或者忘记初始化内存。未定义的behviour可能导致任何情况,包括抛出错误。
删除有什么问题?
你要删除同一指针两次。您可以通过检查调试器中的值来验证这一点。
https://stackoverflow.com/questions/35571298
复制相似问题