Путаница относительно ссылки на объект - PullRequest
0 голосов
/ 22 апреля 2020

Я решал вопросы из связанного списка на хакерранке. Вопрос был прост: вставьте узел в начало связанного списка. Мне только нужно было реализовать функцию для вставки узла в начало связанного списка. Класс связанных списков и другие необходимые функции уже определены. Вот уже приведенный код:

#include <bits/stdc++.h>


using namespace std;

class SinglyLinkedListNode {
  public:
    int data;
  SinglyLinkedListNode * next;

  SinglyLinkedListNode(int node_data) {
    this - > data = node_data;
    this - > next = nullptr;
  }
};

class SinglyLinkedList {
  public:
    SinglyLinkedListNode * head;
  SinglyLinkedListNode * tail;

  SinglyLinkedList() {
    this - > head = nullptr;
    this - > tail = nullptr;
  }

};

void print_singly_linked_list(SinglyLinkedListNode * node, string sep, ofstream & fout) {
  while (node) {
    fout << node - > data;

    node = node - > next;

    if (node) {
      fout << sep;
    }
  }
}

void free_singly_linked_list(SinglyLinkedListNode * node) {
  while (node) {
    SinglyLinkedListNode * temp = node;
    node = node - > next;

    free(temp);
  }
}

// Complete the insertNodeAtHead function below.

/*
 * For your reference:
 *
 * SinglyLinkedListNode {
 *     int data;
 *     SinglyLinkedListNode* next;
 * };
 *
 */
SinglyLinkedListNode * insertNodeAtHead(SinglyLinkedListNode * head, int data) {


}

У меня есть две реализации этой функции: Первая ...

SinglyLinkedListNode * insertNodeAtHead(SinglyLinkedListNode * head, int data) {

  SinglyLinkedListNode node(data);

  node.next = head;
  head = &node;

  return head;
}

Вторая ....

SinglyLinkedListNode * insertNodeAtHead(SinglyLinkedListNode * head, int data) {

  SinglyLinkedListNode * ptr = new SinglyLinkedListNode(data);

  ptr - > next = head;
  head = ptr;

  return head;
}

Второй работает, но первый дает ошибку во время выполнения. Что происходит?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Первый создает SinglyLinkedListNode с автоматами c длительность хранения , что означает, что объект становится недействительным, как только вернется insertNodeAtHead. На практике, объект, вероятно, был размещен в стеке.

Второй использует динамический c срок хранения, что означает, что он остается действительным, пока вы не освободите его, используя delete.

2 голосов
/ 22 апреля 2020

В первом примере вы назначаете адрес локальной переменной для head. Как только функция возвращается, эта переменная выходит из области видимости, и head указывает на недопустимый объект.

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