在另一个动态分配的数组中释放动态分配的数组

时间:2016-09-21 05:17:29

标签: c pointers struct 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);
}

在释放&#34;外部&#34;之前,是否有必要释放我在内部分配的指针。分配内存?

第二行是否会处理第一个分配的内存...我的假设是否定的(它仍然会保留在我认为的堆上,我需要保持这种方式)。

3 个答案:

答案 0 :(得分:1)

只需加上我的两分钱来详细说明为什么部分。

让我们先说明两个概念。

  1. 您需要free() 内存分配器功能分配的每个内存,以避免内存泄漏。

  2. 您需要将malloc()或系列返回的完全指针传递给free()。他们没有层次信息存储到它们中(比如,“结构”类的成员,每个分配都是个人的)。

  3. 因此,要到达内部指针成员foo,您必须访问(取消引用)外部指针tmp

    现在,如果您free()首先是外部指针tmp,那么访问该free-d内存无效会调用undefined behavior。因此,您无法访问内部指针以在其上调用free()。它仍然被分配并导致内存泄漏。

    这就是为什么你必须从内到外释放内存

答案 1 :(得分:0)

第一个malloc将只分配用于保存y成员的空间。删除它只会删除分配的空间。它与你之后分配的内容无关。所以是的,你的假设是正确的。

答案 2 :(得分:0)

你可以遵循这个简单的规则,每个malloc调用都应该有相应的免费调用,否则考虑不释放内存。 free的参数必须是相应malloc返回的值。另外,最好在将指针传递给free之前进行NULL检查。

在您的示例中,struct real的成员为struct xstruct x的成员为int *p。在您的实际代码中,您还必须为p分配内存,并在使用完毕后释放内存。