我创建了一个指针数组。我已将其中一些用作单链表的根。
lgroup
(指针数组)的大小为10
,j
的大小也可以达到10
。我喜欢每个lptr
这样的malloc:
lgroup[i].lptr[j] = (node *) malloc (sizeof(node));
如果我不打算使用它,我会设置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;
}
}
}
}
事情是,经过大量的试验和错误以及许多“双重释放”和其他类似的消息后,我最终得到了这些代码,所以我不能完全确定它是否真的释放了所有内存我声称或者只是碰巧编译并运行没有错误,但没有做我想要的所有事情。我试着在gdb上运行它但是我真的无法通过查看内存地址来理解很多东西所以我很好奇是否有办法检查它是否按预期工作或者我注定要使用它笔和纸,并在我脑海中运行代码。如果碰巧实际上做了它的设计,是否会有更简单,更清洁的方法来实现相同的结果?
提前感谢您,如果您需要任何澄清,请在评论中不要犹豫。
答案 0 :(得分:6)
在Valgrind下运行您的代码。这是一个执行许多操作的内存分析器,但它所做的一件事是在应用程序运行结束时检查未释放的内存。
答案 1 :(得分:2)
在您发布的代码中对free
的第一次调用没有任何效果,因为该参数是一个NULL指针(在该上下文中使用continue
也是不必要的)。
当lgroup[i].lptr[j]
不为NULL并且lgroup[i].lptr[j]->next
为NULL时,您似乎也没有为for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
curr = lgroup[i].lptr[j];
while (curr != NULL) {
curr2 = curr->next;
free(curr);
curr = curr2;
}
}
}
调用。
我会把它重写为:
{{1}}