在另一个动态分配的数组中释放一个动态分配的数组
free a dynamically allocated array inside another dynamically allocated array
假设我有以下简单示例
#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);
}
在释放"outer"分配的内存之前是否需要释放我在里面分配的指针?
第二行会处理第一个分配的内存吗...我的假设是不会(我假设它仍将保留在堆上,我需要保持这种方式)。
第一个 malloc 将只分配 space 用于保存 y
的成员。删除它只会删除分配的 space。它与您之后分配的内容无关。所以是的,你的假设是正确的。
你可以遵循这个简单的规则,每个malloc调用都应该有一个对应的free调用,否则认为内存没有被释放。 free 的参数必须是对应的 malloc 返回的值。此外,最好在将指针传递给 free 之前进行 NULL 检查。
在您的示例中,struct real
的成员是 struct x
,struct x
的成员是 int *p
。在您的实际代码中,您还必须为 p
分配内存,并在使用完成后释放内存。
只是加上我的两分钱来详细说明 为什么 部分。
先说两个概念
您需要free()
每个内存分配器函数分配内存以避免内存泄漏。
您需要将 确切的 指针传递给 malloc()
或 family 返回给 free()
。他们没有任何分层信息存储(比如,"member of the structure"种类,每个分配都是单独的)。
因此,要到达 inner 指针成员foo
,您必须访问(取消引用)外部指针tmp
.
现在,如果您首先 free()
外部指针 tmp
,然后访问该 free-d 内存无效调用 undefined behavior。因此,您无法到达 inner 指针来调用 free()
。它保持分配状态并导致内存泄漏。
这就是为什么,您必须开始从内到外释放内存。
假设我有以下简单示例
#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);
}
在释放"outer"分配的内存之前是否需要释放我在里面分配的指针?
第二行会处理第一个分配的内存吗...我的假设是不会(我假设它仍将保留在堆上,我需要保持这种方式)。
第一个 malloc 将只分配 space 用于保存 y
的成员。删除它只会删除分配的 space。它与您之后分配的内容无关。所以是的,你的假设是正确的。
你可以遵循这个简单的规则,每个malloc调用都应该有一个对应的free调用,否则认为内存没有被释放。 free 的参数必须是对应的 malloc 返回的值。此外,最好在将指针传递给 free 之前进行 NULL 检查。
在您的示例中,struct real
的成员是 struct x
,struct x
的成员是 int *p
。在您的实际代码中,您还必须为 p
分配内存,并在使用完成后释放内存。
只是加上我的两分钱来详细说明 为什么 部分。
先说两个概念
您需要
free()
每个内存分配器函数分配内存以避免内存泄漏。您需要将 确切的 指针传递给
malloc()
或 family 返回给free()
。他们没有任何分层信息存储(比如,"member of the structure"种类,每个分配都是单独的)。
因此,要到达 inner 指针成员foo
,您必须访问(取消引用)外部指针tmp
.
现在,如果您首先 free()
外部指针 tmp
,然后访问该 free-d 内存无效调用 undefined behavior。因此,您无法到达 inner 指针来调用 free()
。它保持分配状态并导致内存泄漏。
这就是为什么,您必须开始从内到外释放内存。