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