用C ++删除指针让我很困惑

时间:2014-02-25 00:50:16

标签: c++ pointers delete-operator

**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;
}**

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

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

在我上面的代码中,我在每个if语句中声明了一个新节点travel-&gt; next,我将旅行向前推进了一步。因此在while循环之后,我的链表变为{2,4,0},并且我有一个指向ListNode {0}的指针“travel”。但是,它无法删除!我已尝试过“删除结果 - >下一个&gt;下一个”和“删除旅行”但它仍然可以返回结果 - > next-&gt; next-&gt; val,这是0! (我的最后一句话)

为什么?

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

2 个答案:

答案 0 :(得分:0)

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

<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 :(得分:0)

我有一些问题。

  1. 您要删除整个旅行列表还是单个节点?
  2. 旅行的初始值是多少?
  3. 您正在检查list1,但未在循环内使用它。提供更多相关细节。
  4. 我假设您需要删除整个旅行列表(list1),并且旅行是list1的迭代器。

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