为何Program A的get_name()引发内存泄漏,Program B却不会?
为什么Program A存在内存泄漏而Program B没有?
核心区别在于两个程序中struct actor的name成员类型不同,以及后续对get_name()分配内存的处理逻辑:
Program A的内存泄漏原因
Program A里的struct actor定义中,name是固定大小的字符数组(char name[32]):
struct actor { char name[32]; struct actor *next; } *head = NULL;
在insertion()函数的执行流程里:
- 调用
get_name()分配了一块32字节的动态内存,返回的指针存在变量n中; - 通过
strcpy(c->name, n)把n指向的内存内容复制到结构体的数组c->name里; - 复制完成后,
n这个指针不再被使用,也没有调用free(n)释放它指向的动态内存。
这块被malloc出来的内存从此失去了唯一引用,程序再也无法定位并释放它,最终造成内存泄漏。
Program B没有内存泄漏的原因
Program B里的struct actor定义中,name是字符指针(char *name):
struct actor { char *name; struct actor *next; } *head = NULL;
在insertion()函数的执行流程里:
- 调用
get_name()分配的动态内存指针,直接赋值给了结构体成员c->name; - 这个指针被保存在结构体中,只要结构体本身还在链表中(或者后续能访问到该结构体),就可以通过
c->name找到这块动态内存,在合适的时机调用free(c->name)完成释放。
因为内存的所有权被转移给了结构体,后续仍有合法释放的渠道,所以不存在内存泄漏。
一句话总结
- Program A:动态内存的内容被复制后,原内存的引用彻底丢失,无法释放 → 泄漏;
- Program B:动态内存的指针被保留在结构体中,后续可正常释放 → 无泄漏。
内容的提问来源于stack exchange,提问作者user13608015
相关产品推荐
相关产品推荐

