CS50第4周Recover代码理解疑问及内存泄漏问题咨询
CS50 Recover(JPEG恢复)代码疑问解答
对代码理解的指正
你对代码整体逻辑的理解基本正确,但有两处细节需要修正:
- JPEG头检测:仅检测前4字节为
0xff、0xd8、0xff、0xe0不够全面,标准JPEG的起始标记是前3字节固定为0xff、0xd8、0xff,第4字节为0xe0到0xef之间的任意值(对应APP0到APP15标记),这样的检测逻辑才能覆盖所有有效JPEG文件头。 - 初始化阶段的内存管理:你提到用
malloc分配了filename指针,但如果程序结束前没有调用free(filename)释放这块内存,也会造成内存泄漏,这一点需要注意。
疑问解答
- 调用
fopen(filename, "w")时,是否会自动创建新文件?
是的。使用"w"模式调用fopen时:
- 若指定文件名不存在,会自动创建新的空文件;
- 若文件已存在,会清空文件原有内容,重新开始写入。
- 运行代码出现内存泄漏,是否是因为打开新输出文件前未关闭之前的输出文件导致的?
这是主要原因之一,同时还有另一项可能:
- 文件资源泄漏:每次打开新的输出文件前,如果没有关闭之前打开的
output_file指针(即未调用fclose(output_file)),会导致系统中残留未释放的文件描述符,属于资源泄漏范畴; - 堆内存泄漏:你通过
malloc分配的filename内存,如果在程序退出前没有用free(filename)释放,也会造成堆内存泄漏。
解决方法:
- 在检测到新JPEG头、准备打开新输出文件前,先判断
output_file是否不为NULL,若是则调用fclose(output_file)关闭旧文件; - 程序执行完毕、退出前,调用
free(filename)释放分配的文件名内存。
内容的提问来源于stack exchange,提问作者King Brain
相关产品推荐
相关产品推荐

