我正在学习 C 中的内存管理。
我有一个指向我malloc
通过大小调整的结构的指针
some_struct *mystruct = malloc(sizeof(some_struct));
后来我free
在那个结构上使用。
在这个结构里面有三个char *
指针;我也malloc他们的记忆。
在释放之前我是否也必须释放它们的内存,*mystruct
或者销毁*mystruct
也会释放结构内的内存?
您绝对还必须释放结构内 char * 指针指向的内存。先这样做,然后释放你的结构
但是不要释放结构内的 char * 指针,如果你在其他地方为那些 char * 指针指向相同的内存(即,如果你已经将你的结构复制到另一个结构实例,那些 char * 指针需要指向有效记忆)。
没有魔法,也没有圣诞老人。你必须自己做这项工作。在您忘记它之前释放您动态分配的所有内存。
就良好实践而言,您应该释放分配的所有内容,将其视为打开和关闭 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 东西时,您只是保留和释放该数据类型在内存中的多少字节。
希望这可以帮助。
这就是为什么您稍后要更改为 c++ 的原因,然后您可以拥有一个自己完成它的结构(如果您将正确的代码放入其析构函数中)。在C中你必须自己完成工作,即在删除你的结构之前,删除结构内部的东西。当然,当你 malloc 一个结构时,你还应该正确初始化结构内的成员,因为最小初始化指针为 0,这样删除它们时就不会出现故障......