我有一个struct a
的向量,大小在编译时是未知的。
每个struct a
都包含指向struct b
向量的指针。 struct b
的向量长度在编译时是未知的。
所以,如果我这样做:
#include <stdio.h>
#include <stdlib.h>
struct b {
int n;
};
struct a {
int n;
struct b *v;
};
int main() {
struct a *s;
struct a *ta;
struct b *tb;
s = (struct a*)malloc(sizeof(struct a) * 32);
s->v = (struct b*)malloc(sizeof(struct b) * 32);
s->n = 1234;
((s->v)+1)->n = 5678;
fprintf(stderr, "%p: %i / %p: %i\n", s, s->n, (s->v)+1, ((s->v)+1)->n);
ta = s;
tb = (s->v)+1;
free(s);
fprintf(stderr, "%p: %i / %p: %i\n", ta, ta->n, tb, tb->n);
return 0;
}
输出例如:
0x1cb3010: 1234 / 0x1cb3224: 5678
0x1cb3010: -1526330504 / 0x1cb3224: 5678
当同一指针中有分配的内存块时,struct b是否可以自动获取释放?或者,我是否必须先为struct b
向量中的每个项目释放单个struct a
向量?
The question on this link已被建议作为此帖的副本,但此处的问题是询问free
调用中的现有功能,而不是询问有关如何进行递归过程的建议的
答案 0 :(得分:4)
简短回答:不,您必须为free
{。}} malloc
。{/ p>
更好的答案:仍然没有,但你可以编写一个函数来释放多个struct成员。这是一个例子:
void freeStruct(struct a *foo)
{
free(foo->v);
free(foo);
}
答案 1 :(得分:2)
对于每个malloc()
,您必须具有对称free()
。
如果您在linux环境中工作,可以使用valgrind检查您的程序。
运行:
valgrind --leak-check=full ./my_prog
并阅读您的错误