gpt4 book ai didi

c - 关于 free() 在 C 中如何工作的说明 -

转载 作者:太空宇宙 更新时间:2023-11-04 00:25:56 24 4
gpt4 key购买 nike

我的问题是关于何时在 C 中使用 free() 是合适的。我使用的是 gcc 4.3.2。

假设,如果必须在链表中释放一堆内存,理想的解决方法是(我猜):

int freeLL(node *a)
{
if(a->next != NULL)
freeLL(a->next);
free(a);
return 0;
}

现在,假设我要对以下 ADT 做类似的事情:

一个指针“VertexNode”,它还有 2 个指针:“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() 释放了?

很抱歉问了这么长的问题。预先感谢您的时间和耐心等待。

最佳答案

不,free 不会递归工作,因此您确实会发生内存泄漏。您发生的运行时错误可能与逻辑错误有关(可能 V->vNULL 或者您在释放之前没有分配它)。

如果您使用的是 Linux,使用 valgrind 可以帮助您分析程序并提及泄漏错误。使用 cc *.c -ggdb 编译然后运行 ​​valgrind --leakcheck=full ./a.out 将输出泄漏错误。

关于c - 关于 free() 在 C 中如何工作的说明 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13645452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com