说我有以下简单的例子
#include <stdlib.h>
#include <stdio.h>
struct x {
int* p;
};
typedef struct y {
x* foo;
}real;
void doSomething();
int main() {
doSomething();
getchar();
return 0;
}
void doSomething() {
real* tmp = (real*)malloc(sizeof(real));
tmp->foo = (x*)malloc(sizeof(x));
free(tmp->foo);
free(tmp);
}
在释放&#34;外部&#34;之前,是否有必要释放我在内部分配的指针。分配内存?
第二行是否会处理第一个分配的内存...我的假设是否定的(它仍然会保留在我认为的堆上,我需要保持这种方式)。
答案 0 :(得分:1)
只需加上我的两分钱来详细说明为什么部分。
让我们先说明两个概念。
您需要free()
内存分配器功能分配的每个内存,以避免内存泄漏。
您需要将malloc()
或系列返回的完全指针传递给free()
。他们没有层次信息存储到它们中(比如,“结构”类的成员,每个分配都是个人的)。
因此,要到达内部指针成员foo
,您必须访问(取消引用)外部指针tmp
。
现在,如果您free()
首先是外部指针tmp
,那么访问该free-d内存无效会调用undefined behavior。因此,您无法访问内部指针以在其上调用free()
。它仍然被分配并导致内存泄漏。
这就是为什么你必须从内到外释放内存 。
答案 1 :(得分:0)
第一个malloc将只分配用于保存y
成员的空间。删除它只会删除分配的空间。它与你之后分配的内容无关。所以是的,你的假设是正确的。
答案 2 :(得分:0)
你可以遵循这个简单的规则,每个malloc调用都应该有相应的免费调用,否则考虑不释放内存。 free的参数必须是相应malloc返回的值。另外,最好在将指针传递给free之前进行NULL检查。
在您的示例中,struct real
的成员为struct x
,struct x
的成员为int *p
。在您的实际代码中,您还必须为p
分配内存,并在使用完毕后释放内存。