#include <stdio.h>
#include <stdlib.h>
// 释放SubStruct链表内存的函数
void freeSubStruct(struct SubStruct *subHead) {
struct SubStruct *current = subHead;
struct SubStruct *next;
while (current != NULL) {
// 释放data指向的内存
if (current->data != NULL) {
free(current->data);
}
next = current->next;
// 释放当前SubStruct节点内存
free(current);
current = next;
}
}
// 释放MainStruct内存的函数
void freeMainStruct(struct MainStruct *mainStruct) {
if (mainStruct != NULL) {
// 释放subHead指向的SubStruct链表内存
if (mainStruct->subHead != NULL) {
freeSubStruct(mainStruct->subHead);
}
// 释放name指向的内存
if (mainStruct->name != NULL) {
free(mainStruct->name);
}
// 释放MainStruct结构体实例内存
free(mainStruct);
}
}
int main() {
// 这里只是模拟动态分配MainStruct结构体实例
struct MainStruct *mainStruct = (struct MainStruct *)malloc(sizeof(struct MainStruct));
mainStruct->subHead = (struct SubStruct *)malloc(sizeof(struct SubStruct));
mainStruct->subHead->data = (int *)malloc(sizeof(int));
mainStruct->name = (char *)malloc(10 * sizeof(char));
// 释放内存
freeMainStruct(mainStruct);
return 0;
}
freeSubStruct
函数:
- 时机:在释放
MainStruct
实例中的subHead
指向的链表时调用。
- 必要性:
SubStruct
链表中的每个节点都动态分配了内存,包括data
指针指向的内存。通过遍历链表,先释放每个节点data
指向的内存,再释放节点自身的内存,防止内存泄漏。
freeMainStruct
函数:
- 释放
subHead
指向的链表:
- 时机:在释放
MainStruct
实例之前。
- 必要性:
subHead
指向的链表是动态分配的,如果不先释放链表,会导致链表占用的内存无法回收。
- 释放
name
指向的内存:
- 时机:在释放
MainStruct
实例之前且在释放subHead
指向的链表之后。
- 必要性:
name
指针动态分配了内存,若不释放会导致内存泄漏。
- 释放
MainStruct
实例:
- 时机:在释放完
subHead
链表和name
指向的内存之后。
- 必要性:
MainStruct
实例本身也是动态分配的,若不释放会导致内存泄漏。