Удалить указатель в C ++ меня смутило

0
**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}, который имеет размер двух узлов.

В моем коде выше я объявил новый узел travel-> следующий в каждом из операторов if, и я перемещаю движение на один шаг дальше. Следовательно, после цикла while мой связанный список становится {2,4,0}, и у меня есть указатель "travel", указывающий на ListNode {0}. Однако его нельзя удалить! Я попробовал оба "удалить result-> next-> next" и "delete travel", но он все равно может вернуть result-> next-> next-> val, что равно 0! (мое последнее выражение cout)

ЗАЧЕМ?

Я объявил этот новый ListNode (который является структурой) в моей памяти кучи. И я хочу удалить этот ListNode из цикла while. Но мое удаление никогда не работает. Может быть, путешествие было в куче в скобках, но появилось как стек памяти после цикла while, потому что я объявляю динамическую память в моем цикле?

  • 2
    Пожалуйста, покажите остальную часть вашего кода.
  • 0
    Что заставляет вас думать, что удаление не удается?
Показать ещё 9 комментариев
Теги:
pointers
delete-operator

2 ответа

0

У меня есть несколько вопросов.

  1. Вы хотите удалить весь список путешествий или одного узла?
  2. Какова инициализация стоимости поездки?
  3. вы проверяете список1, но не используете его внутри цикла. Расскажите об этом подробнее.

Я предполагаю, что вам нужно удалить весь список путешествий (list1), а путешествие - это итератор list1.

travel = list1;
while(list1 != NULL)
{
    list1 = list1->next;
    delete travel;
    travel = list1->next;
}
  • 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
    хорошо, учитывая деструкторы, отредактированная версия будет лучше, я думаю

Ещё вопросы

Сообщество Overcoder
Наверх
Меню