-2

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

我有一个指向我malloc通过大小调整的结构的指针

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

后来我free在那个结构上使用。

在这个结构里面有三个char *指针;我也malloc他们的记忆。

在释放之前我是否也必须释放它们的内存,*mystruct或者销毁*mystruct也会释放结构内的内存?

4

4 回答 4

5

您绝对还必须释放结构内 char * 指针指向的内存。先这样做,然后释放你的结构

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

于 2012-12-23T17:37:06.377 回答
3

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

于 2012-12-23T17:35:57.760 回答
0

就良好实践而言,您应该释放分配的所有内容,将其视为打开和关闭 html 标记,就良好实践而言,最好不要像对待 C++ 中的类或爪哇。

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

#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有一个指向 a 的指针,first_type但它的大小远小于first_type. 因此,当您 malloc 和 free 东西时,您只是保留和释放该数据类型在内存中的多少字节。

希望这可以帮助。

于 2012-12-23T18:15:17.620 回答
0

这就是为什么您稍后要更改为 c++ 的原因,然后您可以拥有一个自己完成它的结构(如果您将正确的代码放入其析构函数中)。在C中你必须自己完成工作,即在删除你的结构之前,删除结构内部的东西。当然,当你 malloc 一个结构时,你还应该正确初始化结构内的成员,因为最小初始化指针为 0,这样删除它们时就不会出现故障......

于 2012-12-23T17:44:18.257 回答