C++ 链表的执行问题
我正在尝试使用一个底层链表结构创建一个堆栈 也许我错了,但是我在使用remove()函数时遇到了问题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检测 双重自由
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),然后删除最初指向标题的临时指针。那意味着你已经把它弄坏了。