You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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()函数的执行流程里:

  1. 调用get_name()分配了一块32字节的动态内存,返回的指针存在变量n中;
  2. 通过strcpy(c->name, n)把n指向的内存内容复制到结构体的数组c->name里;
  3. 复制完成后,n这个指针不再被使用,也没有调用free(n)释放它指向的动态内存。

这块被malloc出来的内存从此失去了唯一引用,程序再也无法定位并释放它,最终造成内存泄漏。

Program B没有内存泄漏的原因

Program B里的struct actor定义中,name是字符指针(char *name):

struct actor {
    char *name;
    struct actor *next;
} *head = NULL;

在insertion()函数的执行流程里:

  1. 调用get_name()分配的动态内存指针,直接赋值给了结构体成员c->name;
  2. 这个指针被保存在结构体中,只要结构体本身还在链表中(或者后续能访问到该结构体),就可以通过c->name找到这块动态内存,在合适的时机调用free(c->name)完成释放。

因为内存的所有权被转移给了结构体,后续仍有合法释放的渠道,所以不存在内存泄漏。

一句话总结

  • Program A:动态内存的内容被复制后,原内存的引用彻底丢失,无法释放 → 泄漏;
  • Program B:动态内存的指针被保留在结构体中,后续可正常释放 → 无泄漏。

内容的提问来源于stack exchange,提问作者user13608015

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:41:38