如何验证一个节点在C++链表中是否已解除分配

How can I verify a node is deallocated in a C++ Linked List?

本文关键字:链表 C++ 是否 解除分配 一个 何验证 验证 节点      更新时间:2023-10-16

我有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;
}

否则我如何删除节点?我不希望我的第一个链表中突然取消链接的节点在系统中浮动。如果该节点中存在重要的敏感信息,该怎么办?难道不应该用其他数据填充并放回空闲内存中吗?

谢谢。

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

除了由了解代码的人进行代码审查之外,没有任何直接的方法可以确保你的代码是正确的-当然,一组良好的测试也有助于确保你的程序正常工作(例如,你可以插入一些元素,删除其中的一些,看看你是否可以在列表中"搜索"它们-它们应该在删除之前,而不是之后),您可以创建长列表并再次删除(数千个项目和数千次以上),并确保您的总体内存使用率在外循环的第一次和最后一次迭代之间不会上升。

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