在c中取消分配结构?

时间:2013-11-27 06:08:42

标签: c memory-management struct malloc

我有很多结构,其中一个看起来像

typedef int Info;  
typedef struct  
{  
    Info info;  
} Item;  

所以,如果我像这样分配:

ItemRef a;  
a= malloc(sizeof(ItemRef));  

其中ItemRef只是类型int

我的问题是,如果我现在解除分配a,它内部info也会被解除分配吗?

因为当我尝试将vale分配给a中的信息然后解除分配然后打印它时我仍然能够访问该值。

那么这是否意味着解除分配结构不会释放其组件?即使我不必单独分配组件?

2 个答案:

答案 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 ;