删除链接列表的最后一个节点后,内存未释放

时间:2012-06-18 18:55:24

标签: c++ pointers data-structures linked-list delete-operator

我编码了以下内容。插入,删除开头,插入开头和结尾都工作正常。以粗体标记的内存未释放。 cout<<temp 会出错吗?请评论此代码的正确性。

void del(node** head)
{
    node* temp = (*head)->next;
    node* prev = *head;
    while(temp ->next!= NULL)
    {
        prev = temp;
        temp = temp -> next;
    }
    cout<<endl<<temp;
    cout<<endl<<prev;

    //delete prev ->next;
    prev -> next = 0;

    delete temp;
    cout<<endl<<"temp after free"<<temp;
    cout<<endl<<prev;
}
void main()
{
    node* head = NULL;  
int x = 5;
head = insert(head,x);
insert(head,6);
insert(head,7);
insert(head,8);
print(head);
del(&head);
print(head);
getch();    }

输出:

Empty List
|5| at 00673BF0
-------------------
|6| at 00673C30
-------------------
|7| at 00673FB8
-------------------
|8| at 00673FF8
-------------------

00673FF8
00673FB8
temp after free00673FF8
00673FB8

|5| at 00673BF0
-------------------
|6| at 00673C30
-------------------
|7| at 00673FB8
-------------------

3 个答案:

答案 0 :(得分:2)

delete不会将指针的值设置为NULL,但指向的内存不再有效(不包含实时node

这意味着cout << temp将打印它仍然具有的指针的值(并且是delete之前的节点的地址),但是解除引用temp(例如{{1} }或*temp)是未定义的行为

注意:现在在temp->next中你修改了del指向的指针,所以你要么不需要双重间接(head)或者您应该将新头部分配给node**

答案 1 :(得分:1)

由于Attila已经指出删除它后取消引用指针是未定义的行为。为防止意外执行此操作,最好在NULL之后直接将delete指定给指针。取消引用NULL指针会立即导致错误指向正确的原因。

答案 2 :(得分:0)

在代码中,首先释放临时节点是件好事。然后在NULL旁边指定prev-&gt;。因此,很容易理解temp节点不可用,这就是使prev-&gt; next NULL。