【问题标题】:Confusion regarding reference of object关于对象引用的混淆
【发布时间】:2020-04-22 16:48:57
【问题描述】:

我正在解决关于hackerrank 的链表问题。问题很简单:在链表的头部插入一个节点。我只需要实现在链表头部插入节点的功能。已经定义了链表类和其他必要的功能。这是已经给出的代码:

#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;
}

第二个有效,但第一个给出运行时错误。发生了什么?

【问题讨论】:

    标签: c++ object reference runtime-error


    【解决方案1】:

    在第一个示例中,您将局部变量的地址分配给head。一旦函数返回,这个变量就会超出范围,head 指向一个无效的对象。

    【讨论】:

    • 在第二个例子中,ptr不也是一个局部变量吗?
    • 是的,但只使用了ptr。如果你取ptr地址,你也会遇到同样的问题。
    【解决方案2】:

    第一个使用自动storage duration 创建一个SinglyLinkedListNode,这意味着一旦insertNodeAtHead 返回,对象就会变得无效。实际上,该对象很可能是在堆栈上分配的。

    第二个使用动态存储持续时间,这意味着它在您使用delete 解除分配之前一直有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 2020-07-28
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多