将指针设置为"nullptr"并不能防止双重删除?
Setting a pointer to `nullptr` doesn't prevent double deletes?
我有一个链表实现,其中有一个LinkedList
类,该类包含一个名为head_
的成员,该成员是指向LinkedListNode
的指针。LinkedListNode
显然包含一个名为next_
的成员,我可以使用它来遍历列表。
我有一个析构函数~LinkedList
,它从head_
开始,在列表delete
中逐步遍历,并将所有指向LinkedListNode
的指针:
~LinkedList() {
LinkedListNode *thru = head_;
while (thru != nullptr) {
LinkedListNode* toDelete = thru;
thru = thru->next;
delete toDelete;
toDelete = nullptr; // LINE *
}
这一切都很好。我的问题是,当我认为我可以安全地为LinkedListNode类插入析构函数时,发生了什么:
~LinkedListNode() {
if (next_ != nullptr) // LINE **
delete next_;
}
这给了我一个堆栈溢出错误,我猜这是因为我试图将delete
和next_
指针加倍,一次来自LinkedList
,一次源自LinkedListNode
。
我的问题是:是否应该在第(*(行将toDelete
指针设置为nullptr
,再加上第(**(行的if()
检查,以防止双重删除错误?
您的问题如下:
~LinkedListNode() {
if (next_ != nullptr) // LINE **
delete next_;
}
想象一下,你有一个链表5、4、3、2、1,而你的头是5,你的下一个是4、3,依此类推。当你调用函数时,你要做的是删除4,其他的都会留在你的系统中,你没有办法删除3、2和1,依此类推,你删除了唯一指向它们的东西,你再也无法访问它们了。许多人建议使用递归解决方案,老实说,如果你在析构函数中这样做,它是不起作用的。如果你真的想这样做,你需要另一个函数:
void deleteLinkedList(Node* head){
if(head == nullptr)return;
Node* temp = head->next;
delete head;
deleteLinkedList(temp);
}
相关文章:
- 将指针设置为"nullptr"并不能防止双重删除?
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 你能帮我解决删除数组 c++ 中重复值的挑战吗?
- C++自定义删除运算符不能正常工作?
- 为什么我们甚至需要删除运算符?(我们不能只使用删除[]吗)
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 将字符串强制转换为GUID并不能得到正确的结果
- 为什么我不能使用已删除或私有析构函数分配类的数组?
- C++运算符删除覆盖并不总是使用
- 不能分配 X 类型的对象,因为它的复制运算符隐式删除
- 为什么具有 list<struct type>::itrator 的 struct 不能通过 clear() 删除?
- Qpropertyanimation并不能保存小部件的最后一个声音
- 删除类复制构造函数时,不能使用使用等号表示法的类构造函数
- 为什么unique_ptr不能阻止自定义删除程序的切片?
- 当 do-while 再次启动时,对象将被删除.我怎么能阻止它
- 多线程计算均值和std并不能提高效率
- PImpl 并不能使我免于导出 STL
- 在派生类中使用声明并不能隐藏从基类派生的相同函数
- 删除带有指针列表的对象并不能真正释放相应的内存
- `like`子句并不能得到所有接近我所说的结果