【问题标题】:How can I verify a node is deallocated in a C++ Linked List?如何验证节点是否在 C++ 链表中被释放?
【发布时间】:2014-09-14 21:29:41
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 内存在被释放时通常不会被清除,因为这将是低效的并且在格式良好的程序中是不必要的。引用释放的内存是未定义的行为。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 2018-06-03
    • 1970-01-01
    • 2017-04-02
    • 2010-12-20
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多