C语言中能否释放仅在printf内部调用的函数的返回值
问题解答
- 你给出的写法
printf("%s", my_function(arg));无法直接释放返回的堆内存:my_function返回的指针是临时右值,printf执行完成后这个临时值就会被丢弃,你无法再获取到对应的内存地址传给free(),会直接造成内存泄漏。 - 正确的操作有两种方案:
- 最推荐的规范写法:先把返回指针存入局部变量,使用完成后再释放
这种写法可读性最高,也不容易出逻辑错误,是工业界代码的通用写法。char* res = my_function(arg); // 一定要判空,避免返回NULL时后续操作触发未定义行为 if (res != NULL) { printf("%s", res); free(res); }
2. 如果确实需要压缩代码行数(非常不推荐,仅做语法说明),可以在赋值后直接使用变量:char* tmp; if ((tmp = my_function(arg)) != NULL) { printf("%s", tmp); free(tmp); } - 核心原则:所有内部通过
malloc申请内存、返回堆指针的函数,都需要调用方主动持有返回的指针值,使用完成后手动调用free()释放,不存在不持有指针就能释放对应内存的语法。
内容的提问来源于stack exchange,提问作者matteobu02
相关产品推荐
相关产品推荐

