Apo*_*ian 4 c++ inner-classes delete-operator
在我的链表实现中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;
}
Run Code Online (Sandbox Code Playgroud)
我删除了与错误无关的所有属性和方法.这个虚拟代码仍会抛出相同的错误.
问题在于你的clear()功能.你看,你认为,由于你编写deleteNode函数的方式,你的所有节点都会被nullptr追踪clear.遗憾的是,这不是真的.您复制head到current_node,并且head(即current_node)的副本nullptr在被删除时变为,但head仍然是非空的.稍后析构函数会再次尝试删除它.在已释放的内存上调用delete会导致Undefined Behavior.
要修复,请添加
head = nullptr;
Run Code Online (Sandbox Code Playgroud)
在你的明确功能的最后
| 归档时间: |
|
| 查看次数: |
3834 次 |
| 最近记录: |