在C中,我是否需要在释放结构时手动释放结构中的指针?

时间:2012-12-23 17:34:46

标签: c pointers memory

我正在学习C中的内存管理。

我有一个指向结构的指针,我malloc通过

大小
some_struct *mystruct = malloc(sizeof(some_struct));

我稍后在该结构上使用free

在这个结构中有三个char *指针;我也记录了他们的记忆。

在我释放*mystruct之前,我是否还必须释放他们的记忆?或者*mystruct的破坏是否也会释放结构中的内存?

4 个答案:

答案 0 :(得分:5)

你还必须释放struct中指向char *指针的内存。先做,然后释放你的结构

但是不要释放struct中的char *指针,如果你指向其他地方的char *指针的相同内存(即,如果你已经将你的struct复制到另一个struct实例,那些char *指针需要指向有效的记忆。)

答案 1 :(得分:3)

没有魔法,也没有圣诞老人。你必须自己做这项工作。释放您在之前动态分配的所有内存,您将忘记它。

答案 2 :(得分:0)

这就是为什么你以后想要更改为c ++的原因,那么你可以拥有一个自己做的结构(如果你把正确的代码放到它的析构函数中)。在C中,您必须自己完成工作,也就是说,在删除结构之前,删除结构中的内容。当然,当你对一个结构进行malloc时,你还应该正确地初始化结构内部的成员,因为最小化指针指向0,这样在删除时就没有毛刺...

答案 3 :(得分:0)

就良好的做法而言,你应该释放你分配的所有东西,把它想象成打开一个html标签并关闭它,就好的做法而言,不要以你对类的方式思考结构是一个好主意。用C ++或java。

释放结构只释放指向对象的指针,而不是对象本身,

#include <stdio.h>                                                                                                                                                                   

typedef struct                                                                                                                                                                       
{                                                                                                                                                                                    
    int a,b,c,d;                                                                                                                                                                     
    char some_string[1050];                                                                                                                                                          

} first_type;                                                                                                                                                                        
typedef struct                                                                                                                                                                       
{                                                                                                                                                                                    
    struct first_type *ap;                                                                                                                                                           
} second_type;                                                                                                                                                                       

int main(void)                                                                                                                                                                       
{                                                                                                                                                                                    
    printf("first type: %d\n", sizeof(first_type));                                                                                                                                  
    printf("second type: %d\n", sizeof(second_type));                                                                                                                                
}          

如果你运行这个小例子,你会看到类似这样的东西

  

第一种类型:1068

     

第二种类型:8

虽然second_type有一个指向first_type的指针,但它的大小远小于first_type。因此,当你使用malloc和free东西时,你只需要保留和释放数据类型在内存中的许多字节。

希望这有帮助。