Указатель головы не останется впереди (C ++) - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь создать связанный список, у меня есть класс Node и класс List. Конструктор списка устанавливает Head и Tail (типа Node *) в nullptr. Оба класса являются шаблонными. Мой метод вставки для списка не будет держать указатель головы в начале, и я действительно не уверен, почему. Он назначается только один раз, когда head == nullptr.

Вот метод вставки.

void insert(T item)
    {
      //insert item at end
      //allocate new node
      Node<T> tempNode = Node<T>(item);
      Node<T> *temp = &tempNode;
      //put in data
      temp->setData(item);
      //end of list set to null
      temp->setNext(nullptr); 

      //if first node
      if (head == nullptr)
      {
        //head and tail are set to temp
        head = temp;
        cout << "head1: " << head->getData() << endl;
        tail = temp;
      } else //not first node in list
      { cout << "head: " << head->getData() << endl;
        tail->setNext(temp);
        tail = temp;
      }

      cout << "tail: " << tail->getData() << endl;
      cout << "head: " << head->getData() << endl;
      cout << "head: " << head << endl;
    }

мне нужен только для того, чтобы увидеть, что происходит. Каждое head->getData() Производит значение, которое в настоящее время хранится в temp, однако, когда я печатаю головку, это каждый раз один и тот же адрес.

, просто чтобы уточнить, у меня есть отдельный тестовый файл, который повторяет цикл 0-9, пытаясь вставить каждое значение , Результаты этого ...

head1: 0
tail: 0
head: 0
head: 0x7fffc574dc40
head: 1
tail: 1
head: 1
head: 0x7fffc574dc40
head: 2
tail: 2
head: 2
head: 0x7fffc574dc40
head: 3
tail: 3
head: 3
head: 0x7fffc574dc40
head: 4
tail: 4
head: 4
head: 0x7fffc574dc40
head: 5
tail: 5
head: 5
head: 0x7fffc574dc40
head: 6
tail: 6
head: 6
head: 0x7fffc574dc40
head: 7
tail: 7
head: 7
head: 0x7fffc574dc40
head: 8
tail: 8
head: 8
head: 0x7fffc574dc40
head: 9
tail: 9
head: 9
head: 0x7fffc574dc40

1 Ответ

6 голосов
/ 15 апреля 2020

Одной из основных проблем являются следующие две строки:

Node<T> tempNode = Node<T>(item);
Node<T> *temp = &tempNode;

Здесь вы указываете temp на локальную переменную tempNode. Когда функция insert возвращает время жизни tempNode, оно заканчивается и уничтожается. Указатель temp (и все копии этого указателя) станут недействительными. Попытка использовать этот указатель впоследствии приведет к неопределенному поведению .

Обычным решением для создания новых узлов является их динамическое выделение:

Node<T>* temp = new Node<T>(item);

У вас, конечно, есть запомнить delete все узлы, которые вы создаете таким образом, чтобы избежать утечек памяти .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...