C++ 链表的执行问题

C++ 链表的执行问题,c++,memory,linked-list,allocation,C++,Memory,Linked List,Allocation,我正在尝试使用一个底层链表结构创建一个堆栈 也许我错了,但是我在使用remove()函数时遇到了问题 int Stack::remove(){ node* victim = new node; int popped; popped = top->element; victim = top; top = victim->next; delete victim; return popped; } 我正在进行glibc检测 双重自由

我正在尝试使用一个底层链表结构创建一个堆栈

也许我错了,但是我在使用remove()函数时遇到了问题

int Stack::remove(){  
  node* victim = new node;  
  int popped;  
  popped = top->element;  
  victim = top;
  top = victim->next;  
  delete victim;  
  return popped;  
}
我正在进行glibc检测

双重自由或腐败(外)


既然我正在为受害者分配新内存,难道我不必删除受害者,或者这是我不必担心的吗?

没有理由像处理
受害者那样在
remove()
方法中分配堆内存。你想要的是:

int Stack::remove(){  
  node* new_top = top->next;
  int popped = top->element;

  delete top;  
  top = new_top;

  return popped;  
}

没有理由像对待
受害者那样在
remove()
方法中分配堆内存。你想要的是:

int Stack::remove(){  
  node* new_top = top->next;
  int popped = top->element;

  delete top;  
  top = new_top;

  return popped;  
}

您不需要为
受害者
分配节点。只需将堆栈的顶部分配给它,如果它不是
null
,则将
top
设置为其
next
指针,从
受害者
中检索值,然后解除分配
受害者


这实际上不是一个损坏,而是一个内存泄漏-您正在分配一个节点,然后用
victor=top覆盖该指针
因此无法跟踪刚刚分配的内存。

您不需要为
受害者分配节点。只需将堆栈的顶部分配给它,如果它不是
null
,则将
top
设置为其
next
指针,从
受害者
中检索值,然后解除分配
受害者


这实际上不是一个损坏,而是一个内存泄漏-您正在分配一个节点,然后用
victor=top覆盖该指针因此失去了刚刚分配的内存。

一个堆栈很像一堆正在清洗的盘子,它们彼此叠在一起。即,第一个输入是最后一个输出(FILO数据类型)。也就是说,如果堆栈读入2、7、8,那么它将显示为:

八,

七,

二,

也就是说,首先将2放入堆栈中,然后是7,然后是8。如果要移除或弹出堆栈,则需要移动指针的头部。我觉得你的代码有点奇怪

int Stack::remove()
 {
  int datum;      //to store the popped value
  node* temp=head;  //assign pointer to head of list
  datum = temp->data; //grab the data value stored at the head (or temp since they carry same reference)
  head = temp->next; //move the head pointer (in our example now it points to 7)
  delete temp;
  return datum;
 }

一堆很像是一堆正在清洗的盘子,它们相互叠放在一起。即,第一个输入是最后一个输出(FILO数据类型)。也就是说,如果堆栈读入2、7、8,那么它将显示为:

八,

七,

二,

也就是说,首先将2放入堆栈中,然后是7,然后是8。如果要移除或弹出堆栈,则需要移动指针的头部。我觉得你的代码有点奇怪

int Stack::remove()
 {
  int datum;      //to store the popped value
  node* temp=head;  //assign pointer to head of list
  datum = temp->data; //grab the data value stored at the head (or temp since they carry same reference)
  head = temp->next; //move the head pointer (in our example now it points to 7)
  delete temp;
  return datum;
 }

您可能需要加入一些错误检查来检查是否为空。应该将“临时->下一步”设置为空,因为有些人创建自定义析构函数,以便在删除节点时,它会递归删除它所指向的节点to@Jaelebi不,因为temp被删除了,所以请仔细查看实现,因为temp只是暂时成为列表的标题。移动磁头,然后使用delete解除分配temp。你可以说
temp->next=NULL就在“删除临时文件”之前`但是,考虑到您正在删除它,并且函数结束,它没有任何作用。您可能需要进行一些错误检查以检查是否为空。是否应该将NOLDNT temp->next设置为空,因为有些人创建自定义析构函数,以便在删除节点时,它会递归删除它所指向的节点to@Jaelebi没有,因为临时文件已被删除,仔细看一下实现,因为temp只是暂时成为列表的第一位。移动磁头,然后使用delete解除分配temp。你可以说
temp->next=NULL就在“删除临时文件”之前`但是,考虑到您正在删除它并且函数结束,它没有任何作用。分配内存或为受害者节点使用新节点没有意义。请记住,指针只是一个引用,因此只需将其指向列表的开头即可。保存数据值,将列表的标题移动到下一个元素(可能需要检查NULL),然后删除最初指向标题的临时指针。这意味着您已经弹出了它。为受害者节点分配内存或使用新节点没有意义。请记住,指针只是一个引用,因此只需将其指向列表的开头即可。保存数据值,将列表的标题移动到下一个元素(可能需要检查NULL),然后删除最初指向标题的临时指针。那意味着你已经把它弄坏了。