c ++构造函数似乎每次都返回指向同一对象的指针

时间:2017-08-10 12:49:37

标签: c++

我有一个Linked list类的简单实现,它有指向我已经定义的Node对象的指针。

函数insertHead创建一个新节点并将其插入头部。 但是,每当我调用该函数时,构造函数似乎每次都返回一个指向同一对象的指针。 (我使用GDB检查过)

我在这里粘贴代码的片段。如果有什么东西出现,有人可以告诉我吗?

void LinkedList::insertHead(int val){
  Node temp(val);
   if(head == NULL){
    head = tail = &temp;
  } else {
     temp.setNext(head);
     head = &temp;
  }
}

班级定义:

class LinkedList{

  Node *head;
  Node *tail;
...

class Node{

  int val;
  Node *next;
...

Node::Node(int x){
  val = x;
  next = NULL;
}

2 个答案:

答案 0 :(得分:1)

您需要在堆上而不是堆栈上分配节点。 (我鼓励你阅读这两篇文章)。如果支持,请使用nullptr代替NULL(> c ++ 11)

void LinkedList::insertHead(int val){
  Node* temp = new Node(val);
  if(head == nullptr){
    head = tail = temp;
  } else {
     temp->setNext(head);
     head = temp;
  }
}

这还需要您使用delete正确清理节点以避免内存泄漏,这很可能需要在列表类中添加自定义析构函数,这些都是这样的:

LinkedList::~LinkedList() {
  Node* node = head;
  while(node != nullptr) {
    Node* toDel = node;
    node = node->next;
    delete toDel;
  }
}

答案 1 :(得分:1)

cant 指定automatic storage变量的地址并将其用于正文,因为它已超出范围(undefined behaviour)。您需要在heap上为node动态分配空间。

Node * temp = new Node(val);
if(head == NULL)
{
    head = tail = temp;
} else {
    temp.setNext(head);
    head = temp;
}

在析构函数中释放所有节点。