C语言中以下三类代码场景是否需要手动释放已分配内存?
C语言三类代码场景的内存释放判断
以下逐个说明三个示例的内存管理要求:
- 示例1
代码片段:
不需要执行额外释放操作。这里赋值给char* var1 = "Random string";var1的是字符串字面量,这类数据默认存放在程序的静态只读存储段,生命周期贯穿程序整个运行周期,程序退出时由操作系统统一回收。如果强行对这类指针调用free(),会触发未定义行为,大概率直接崩溃。 - 示例2
代码片段:
这段代码本身存在严重bug:char* firstline; fscanf(input, "%s", firstline);firstline是未初始化的野指针,没有指向任何合法可写的内存空间,直接传入fscanf写入数据会立刻触发内存访问错误。
要让逻辑正常运行,你必须先给firstline绑定合法内存:如果是用malloc/calloc/realloc在堆上动态分配的内存,使用完成后必须调用free()释放;如果是让指针指向栈上提前定义好的字符数组,不需要手动释放,栈空间会在变量离开作用域时自动回收。 - 示例3
代码片段:
不需要执行额外释放操作。数组内存储的三个元素都是字符串字面量,和示例1的存储位置、生命周期完全一致;如果这个数组是局部变量,数组本身存储在栈上,离开作用域后会自动回收,全程没有需要手动管理的堆内存。char* names[] = {"Karla", "Rob", "Tom"};
通用判断规则:只有你通过
malloc/calloc/realloc等内存分配函数在堆上申请的内存,才需要手动调用free()释放;栈内存、静态存储区的内存都不需要手动干预。
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

