如何在C ++链接列表中验证节点是否已取消分配?

时间:2014-09-14 21:29:41

标签: c++ xcode struct linked-list singly-linked-list

我有Xcode,我想知道如何验证我的节点是否被正确删除/取消分配。我确信我会以错误的方式解决这个问题。

我正在做的是从ptrDel指向的内容打印数据,然后使用Delete来释放它,并检查我是否可以再次查看它(是的,我仍然可以)。我以为这块内存会被"归零"出或填充了没有旧数据的东西。为什么还能看到那里有什么?我不应该得到一个"糟糕的内存访问"来自XCode的错误?

这是我的结构

struct Node {
  int data; 
Node* next;
 };  

.......

bool deleteNode(Node **head, Node *ptrDel) {
     Node *cur = *head;

    printf("deleteNode top %d \n", ptrDel->data); //"deleteNode top a" would be the output for example


   if(ptrDel == *head) {
     *head = cur->next;
     delete ptrDel;
     printf("deleteNode 2 %d \n", ptrDel->data);  //"deleteNode top a" would be the output
     return true;
   }  

   while(cur) {
    if(cur->next == ptrDel) {
        cur->next = ptrDel->next;
        delete ptrDel;
        printf("deleteNode 2 %d \n", ptrDel->data); //"deleteNode top a" would be the output
        return true;
     }
     cur = cur->next;
   }


return false;
}

我还能如何删除节点?我不希望我的第一个链接列表中突然取消链接的节点在系统中浮动。如果该节点中有重要的敏感信息怎么办?难道它不会被其他一些数据填满并放回到空闲内存中吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

使用delete释放的内存通常根本不会更改。取消链接后,您可以执行ptrDel->next = NULL之类的操作,以避免以后生成有效链。

除了理解代码的人的代码审查之外,没有直接的方法来确保您的代码是正确的 - 当然,一组好的测试对于确保代码有效也很有用(例如,您可以插入一些元素,删除其中的一些,看看你是否可以在列表中“搜索”它们 - 它们应该在删除之前,而不是之后),你可以创建长列表并再次删除(几千个项目)并且数千次以上),并确保在外部循环的第一次和最后一次迭代之间,您的整体内存使用率不会上升。

Valgrind等工具也可用于识别泄漏内存的位置。