我怎么知道我是否成功地释放了整个单链表?

Ete*_*ght 3 c malloc free list

我创建了一个指针数组.我已将其中一些用作单链表的根.的大小lgroup(指针数组)是10j可以得到高达10为好.我lptr喜欢这样的每一个:

lgroup[i].lptr[j] = (node *) malloc (sizeof(node));
Run Code Online (Sandbox Code Playgroud)

如果我不打算使用它我会设置curr = lgroup[i].jptr[j];curr->next = NULL;.否则我只是开始使用malloc每一个curr->next然后我做curr = curr->next;.当我不想在列表中添加任何更多节点时,我只是放入curr->next = NULL;并继续下一个节点lptr.很标准的东西.

在我的程序结束时,我想要free我为我的列表声明的所有内存.这是我尝试这样做的方式:

for (i = 0; i < 10; i++) {
  for (j = 0; j < 10; j++) {
    if (lgroup[i].lptr[j] == NULL) {
      free(lgroup[i].lptr[j]);
      continue;
    } else {
      curr = lgroup[i].lptr[j];
      while(curr->next != NULL) {
        curr2 = curr->next;
        free(curr);
        curr = curr2;
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

事情是,经过大量的试验和错误以及大量的"双重释放"和其他类似的消息,我最终得到了这些代码,所以我不能完全确定它是否真的释放了我拥有的所有内存声称或者它恰好在没有错误的情况下编译和运行,但没有完成我想要的所有事情.我试着在gdb上运行它但是我真的无法通过查看内存地址来理解很多东西所以我很好奇是否有办法检查它是否按预期工作或者我注定要使用它笔和纸,并在我脑海中运行代码.如果碰巧实际上做了它的设计,是否会有更简单,更清洁的方法来实现相同的结果?

提前感谢您,如果您需要任何澄清,请在评论中不要犹豫.

Oli*_*rth 6

Valgrind下运行您的代码.这是一个执行许多操作的内存分析器,但它所做的一件事是在应用程序运行结束时检查未释放的内存.