我有很多结构,其中一个看起来像
typedef int Info;
typedef struct
{
Info info;
} Item;
所以,如果我像这样分配:
ItemRef a;
a= malloc(sizeof(ItemRef));
其中ItemRef
只是类型int
。
我的问题是,如果我现在解除分配a
,它内部info
也会被解除分配吗?
因为当我尝试将vale分配给a中的信息然后解除分配然后打印它时我仍然能够访问该值。
那么这是否意味着解除分配结构不会释放其组件?即使我不必单独分配组件?
答案 0 :(得分:2)
取消分配结构会为其成员释放空间。但是,C语言的规则不要求释放的内存被清零或以任何方式无法访问。所有释放都告诉内存管理器你已经完成了那段内存,它可以自行重复使用它。
因此,在一个典型的实现中,如果你仍然有一个指向释放内存的指针,编译器将不会做任何事情来阻止你访问它。这样做会使您进入未定义行为的领域,这意味着任何事情都可能发生。以这种方式搞乱并访问释放的内存是C程序中烦人且难以发现的错误的根源,因为行为通常不一致。
答案 1 :(得分:1)
来自http://opengroup.org/onlinepubs/007908775/xsh/free.html
free()函数导致ptr指向的空间 释放;也就是说,可用于进一步分配。如果是ptr 空指针,不会发生任何操作。否则,如果参数没有 匹配之前由calloc(),malloc(),realloc()返回的指针 或者valloc()函数,或者如果通过调用释放空间 free()或realloc(),行为未定义。 任何指针的使用 引用自由空间会导致未定义的行为。
根据文档,free
不会将释放的所有内存位初始化为任何值。因此,内存(可能)仍包含旧值。但它的未定义行为是指如上所述。
最佳做法是::
free(a) ;
a = NULL ;