delete尾节点后遍历链表导致ERROR: AddressSanitizer,疯狂打印地址?解决方案在这
·

食用指南:
框架使用过程中的问题首先要注意版本发布时间造成方法弃用
当你在CSDN等网站查找不到最新版本框架的问题解决,别迟疑,马上去Goole
语言问题比框架问题好解决
如果本篇debug博客解决了你的问题,不妨留下你的👍
欢迎关注博主,查看更多c/c++/JAVA/算法/框架知识
语言:
- c++利用struct{} 和 next指针 创建链表
问题描述:
- 在Leetcode2.两数相加时,delete多余的最高位进位时发生内存泄露
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode();
auto p = head;
int t = 0;
while(l1 || l2){
if (l1) t += l1->val, l1 = l1->next;
if (l2) t += l2->val, l2 = l2->next;
p->val = t %10;
t /= 10;
p->next = new ListNode();
p = p->next;
}
if (t) p->val = t;
else delete p, p=NULL;
return head;
}
};
- 报错为:
=/=42==ERROR: AddressSanitizer: heap-use-after-free on address Ox6020000001b8 at pc Ox00000037afd4 bp 0x7fff22030230 sp 0x7fff22030228 READ of size 8 at Ox6020000001b8 thread TO
解决方案:
问题原因:
-
链表尾节点p指向空间确实被释放,且p也确实指向了NULL
-
但是遍历链表时,尾节点的上一节点的next指针还指向尾节点
-
遍历时,代码一般写作不遇到NULL不停止
所以会从已经释放的尾节点空间一直向下遍历整个内存空间
造成内存泄露,疯狂打印地址。或者leetcode的ERROR: AddressSanitizer


解决方案:
- 删除链表尾节点时,不仅仅要将尾节点指针指向NULL
- 还要将尾节点的上一节点的next指针也指向NULL
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode();
auto p = head;
ListNode* q = NULL; //记录尾节点的上一节点
int t = 0;
while(l1 || l2){
if (l1) t += l1->val, l1 = l1->next;
if (l2) t += l2->val, l2 = l2->next;
p->val = t %10;
t /= 10;
p->next = new ListNode();
q = p;
p = p->next;
}
if (t) p->val = t;
else delete p, q->next = NULL; //尾节点上一节点next指针指向NULL
return head;
}
};
安利时间:
-
如果本篇博客解决了你的问题,不妨留下你的👍
让博主知道原来也有小伙伴在同一个坑摔倒了啊hh
-
欢迎关注大二的博主,在学习C/C++/JAVA/算法/框架的路上作伴
更多推荐
所有评论(0)