我的问题是关于何时在 C 中使用 free() 是合适的。我使用的是 gcc 4.3.2。
假设,如果必须在链表中释放一堆内存,理想的解决方法是(我猜):
int freeLL(node *a)
{
if(a->next != NULL)
freeLL(a->next);
free(a);
return 0;
}
现在,假设我要在以下 ADT 上做类似的事情:
一个指针“VertexNode”,它还有两个指针:“Vertex”和“Edge”(比如说)。相当于说:
struct vertexnode
{
vertex *v;
edge *e;
}
typedef struct vertexnode* VertexNode;
稍后,在初始化实例时,我将执行以下操作 -
VertexNode V = malloc(sizeof(struct vertexnode));
V->v = malloc(sizeof(vertex));
因此,最终在释放时:我使用了与链表相同的类比。
free(V->v);
free(V);
这给出了运行时错误,当我注释掉“free(V->v)”时,程序运行良好。我的问题是:
a) 简单地做 free(V) 就足够了吗?我的意思是,free() 是否对给定指针内的所有指针递归工作?
b)如果没有,在这种情况下是否存在内存泄漏?我如何在理想情况下防止这种情况发生?
c) 最后,有没有一种方法可以跟踪 malloc() 分配了多少字节以及 free() 释放了多少字节?
对于这个冗长的问题,我感到非常抱歉。提前感谢您的时间和耐心。