这个问题在这里已有答案:
在我的任务中,我使用的是我自己创建的结构。问题是,当释放分配的内存时,我首先要释放它的结构字段就足以调用free(ptrToStruct)了吗?
struct Prof{
char* first_name;
char* second_name;
char** trained_classes;
int count_of_assigned_classes;
int max_classes_to_take;
int count_of_trained_classes;
int assigned_to_untrained;
};
不。如果您在结构中有指向堆分配内存的指针,则应首先释放它们。原因是结构内指针指向的区域位于堆的其他部分。释放指向结构本身的指针只会释放结构的内存区域,而不释放结构内指针所指向的内存区域。
你需要free()
由前一个malloc()
calloc()
或realloc()
调用返回的每个指针(即指针指向的已分配内存)。换句话说,分配器函数返回的每个指针都需要传递给free()
。
此外,一旦传递到free()
,内存位置不再被访问,free()
的方式是首先释放内部成员(需要访问结构指针,如ptrToStruct->first_name
),然后指向结构的指针本身(ptrToStruct
)。