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

**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 по связанному списку. И мой тестовый пример — это рекурсия, и эта функция слияния — это list1 = {2} и list2 = {4} , поэтому функция слияния предназначена для возврата заголовка связанного списка {2,4}, который имеет размер двух узлов.

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

ЗАЧЕМ?

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


person user3349040    schedule 25.02.2014    source источник
comment
Пожалуйста, покажите остальную часть кода.   -  person Sergey Kalinichenko    schedule 25.02.2014
comment
Что заставляет вас думать, что удаление не удается?   -  person Barmar    schedule 25.02.2014
comment
пожалуйста, вставьте полную функцию или, по крайней мере, покажите больше контекста   -  person 4pie0    schedule 25.02.2014
comment
Объекты в C/C++ никогда не перемещаются.   -  person Elazar    schedule 25.02.2014
comment
вы зацикливаетесь и выполняете много новых и только одно удаление, это как минимум утечка памяти   -  person paulm    schedule 25.02.2014
comment
Я видел движущиеся объекты в C++   -  person 4pie0    schedule 25.02.2014
comment
ваша сторона указателя в этой функции creazy   -  person 4pie0    schedule 25.02.2014
comment
@piotruś правда? (или это каламбур на std::move())   -  person Elazar    schedule 25.02.2014
comment
Я просто предполагаю, потому что не вижу остального кода, но, возможно, деструктор (ListNode::~ListNode) пытается delete next, но next не инициализируется нулем в конструкторе. Чтобы исправить это, просто инициализируйте next нулем в конструкторе.   -  person Dialecticus    schedule 25.02.2014
comment
пожалуйста, используйте shared_ptr/unique_ptr или даже auto_ptr (для C++03), а не необработанный указатель   -  person Bryan Chen    schedule 25.02.2014
comment
мой код только что был обновлен! Любая помощь будет сильно оценена!!   -  person user3349040    schedule 26.02.2014


Ответы (2)


используйте это в цикле, чтобы предотвратить утечку памяти

<pointer to struct for list2> tmp1 = list2; 
list2 = list2->next; 
delete tmp1;
<pointer to struct for travel> tmp2 = travel; travel = travel->next;
delete tmp2;
person mangusta    schedule 25.02.2014
comment
@Элазар, я так не думаю. что произойдет, если какая-то структура имеет деструктор? - person ikh; 25.02.2014
comment
хорошо, учитывая деструкторы, отредактированная версия будет лучше, я думаю - person mangusta; 25.02.2014

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

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

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

travel = list1;
while(list1 != NULL)
{
    list1 = list1->next;
    delete travel;
    travel = list1->next;
}
person Banukobhan Nagendram    schedule 25.02.2014
comment
Я дал свой ответ в соответствии с моим предположением. Если мои предположения неверны, дайте больше деталей. Это поможет разобраться в вопросе. - person Banukobhan Nagendram; 25.02.2014