C++中的删除指针让我很困惑

Delete Pointer in C++ got me confused

本文关键字:指针 删除 C++      更新时间:2023-10-16
**struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* Merge(ListNode* list1, ListNode* list2){//list1 2; list2 4
ListNode* result = new ListNode(0);
ListNode* travel = result;
while(list1 || list2){
cout << "hereWhile" << endl;
//cout << list1->val << list2->val << endl;
if(!list1){
travel->val = list2->val;
list2 = list2->next;
travel->next = new ListNode(0);
travel = travel->next;
}
else if(!list2){
travel->val = list1->val;
list1 = list1->next;
travel->next = new ListNode(0);
travel = travel->next;
}
else{
if(list1->val <= list2->val){
travel->next = new ListNode(0);
travel->val = list1->val;
list1 = list1->next;
travel = travel->next;
}
else{
travel->next = new ListNode(0);
travel->val = list2->val;
list2 = list2->next;
travel = travel->next;
}
}
}
cout << "travel at the end: " << (travel == result->next->next) << endl;
delete result->next->next;
//delete travel;
cout << travel->val << endl;
cout << result->val << endl;
cout << result->next->val << endl;
cout << "val: " << result->next->next->val << " end" << endl;
return NULL;
}**

在我的情况下,上面的delete方法永远不会起作用。

为了提供更多详细信息,我已经更新了整个代码。这是实现MergeSort by链表的一部分。我的测试用例是这个递归,这个Merge函数是list1={2}和list2={4},所以Merge函数被设计为返回大小为两个节点的链表{2,4}的头。

在上面的代码中,我在每个if语句中声明了一个新的节点travel->next,并将travel向前移动了一步。因此,在while循环之后,我的链表变成了{2,4,0},并且我有一个指针"travel"指向ListNode{0}。但是,它不能被删除!我尝试过"delete result->next->next"answers"delete travel",但它仍然可以返回result->next->next->val,即0!(我最后一次发言)

为什么?

我在堆内存中声明了这个新的ListNode(它是一个结构)。我想从while循环中删除这个ListNode。但我的删除永远不会奏效。也许旅行是在括号中的堆中,但在while循环之后作为堆栈内存出现,因为我在循环中声明了动态内存?

在循环中使用此项来防止内存泄漏

<pointer to struct for list2> tmp1 = list2; 
list2 = list2->next; 
delete tmp1;
<pointer to struct for travel> tmp2 = travel; travel = travel->next;
delete tmp2;

我有一些问题。

  1. 您想删除整个旅行列表还是单个节点
  2. 旅行的初始值是多少
  3. 您正在检查list1,但没有在循环中使用它。请提供更多详细信息

我假设您需要删除整个travel列表(list1),travel是list1的迭代器。

travel = list1;
while(list1 != NULL)
{
list1 = list1->next;
delete travel;
travel = list1->next;
}