2016-02-24 6 views
-3

Я определил в своем классе List<T> функцию, которая позволяет мне изменить содержимое списка: он возвращает новый список, который является результатом перебора первого списка.Функция застряла при возврате

template <typename T> 
List<T> List<T>::reverse(void) 
{ 
    List<T> result; 
    Nodo<T>* aux = head; 

    while (aux != NULL) 
    { 
     result.push_front(aux->getValue()); 
     aux = aux->getNext(); 
    } 

    return result; 
} 

В main.cpp я объявлен IntegerList объект (IntegerList расширяет List<int>).

Когда я вызываю функцию, выполняющую list.reverse(), моя программа застревает, с любым сообщением.

Но в основной функции программа всегда застревает, и после вызова reverse, использование процессора взлетает от 2% до 30% ...

Это моя копия конструктор List<T>:

template <typename T> 
List<T>::List(const List<T>& copy) 
{ 
    head = new Nodo<T>(copy.head); 
    Nodo<T>* aux = copy.head->getNext(); 

    while (aux != NULL) 
    { 
     push_back(aux); 
     aux = aux->getNext(); 
    } 
} 

и эти мои копии конструкторы узла:

template <typename T> 
Nodo<T>::Nodo(const Nodo<T>& copy) 
{ 
    value = copy.value; 
    next = copy.next; 
} 

template <typename T> 
Nodo<T>::Nodo(Nodo<T>* copy) 
{ 
    value = copy->getValue(); 
    next = copy->getNext(); 
} 

это push_back определение & push_front:

template <typename T> 
void List<T>::push_front(Nodo<T>* node) 
{ 
    push_front(node->getValue()); 
} 

template <typename T> 
void List<T>::push_front(const T& item) 
{ 
    if (isEmpty()) // se la lista è vuota 
     head = new Nodo<T>(item); 
    else 
    { 
     Nodo<T> *add = new Nodo<T>(item, head); 
     head = add; 
    } 
} 

template <typename T> 
void List<T>::push_front(const Nodo<T> node) // this is probably useless 
{ 
    if (isEmpty()) 
     head = new Nodo<T>(node.getValue(), NULL); 
    else 
    { 
     node.setNext(head->getNext()); 
     head = new Nodo<T>(node); 
    } 
} 

template <typename T> 
void List<T>::push_back(Nodo<T>* node) 
{ 
    if (isEmpty()) 
     push_front(node); 
    else 
    { 
     Nodo<T>* aux = head; 

     while (aux->getNext() != NULL) 
      aux = aux->getNext(); 

     aux->setNext(node); 
    } 
} 

template <typename T> 
void List<T>::push_back(const T& item) 
{ 
    push_back(new Nodo<T>(item)); 
} 

Я также пытался «сломать все» во время отладки и мой код stucked в данный момент:

template <typename T> 
Nodo<T>* Nodo<T>::getNext(void) 
{ // my code is stucked at this parenthesis 
    return next; 
} 

, но я не знаю, где появляется вызов getNext функции.

+0

Покажите нам свой конструктор копирования. – 0x499602D2

+1

, вероятно, потому, что 'while (aux! = NULL)' всегда встречается. Но без полного примера мы не можем вам помочь. –

+0

@ Jérôme Leducq Я попытался изменить IntegerList, сформированный 7-8-9-10. – Clyky

ответ

1

Ваш конструктор копирования связывает один и тот же узел с построенным списком, который остается связанным в исходном списке. Это первоначальное повреждение ссылок быстро приводит к удалению узлов, связанных в не удаленном списке, что, по-видимому, приводит к циклической ссылке, которая выполняется навсегда.

Компилятор может исключить построение копии для возврата по значению. Но это не обязательно. Ваши сообщенные симптомы подразумевают, что возврат по значению вызывает создание копии.

+0

Большое вам спасибо за помощь! проблема заключалась в моем конструкторе копирования, который создал бесконечный цикл. – Clyky