将getline分配内存的指针拷贝到数组后该如何正确释放内存?
结论
你当前的设计是正确的,必须在使用完全局数组后调用free_source_lines释放所有行对应的内存,仅释放read_lines末尾的lnptr完全不够,会造成严重的内存泄漏。
原理说明
getline的内存分配逻辑是:当你传入的lnptr为NULL、n为0时,它会直接在堆上分配足够存储当前行的内存,将内存的首地址写入lnptr这个栈上的指针变量中。
你代码中的循环逻辑已经做了正确的指针转移处理:
- 读到非空行时,你把
lnptr存储的堆内存地址赋值给G_source_lines的对应元素,随后立即将lnptr置为NULL。此时栈变量lnptr已经不持有该堆内存的地址,地址仅存在于全局数组中 - 读到空行时,你直接释放了
lnptr指向的堆内存,再将lnptr置为NULL - 循环结束后执行的
free(lnptr),此时lnptr已经是NULL,free(NULL)是合法无操作的调用,完全不会触及全局数组中存储的所有堆内存地址
如果你不调用free_source_lines遍历释放全局数组中每个指针指向的堆内存,这些内存直到程序退出前都不会被系统回收,属于典型的内存泄漏。
代码优化建议
- 你代码中
read_lines末尾的注释描述有错误:lnptr本身是栈上分配的指针变量,不需要free,你free的始终是它指向的堆内存,这行free(lnptr)实际不会产生任何作用,保留或删除都不影响运行 - 建议恢复你注释掉的
MAXSRCLNS边界检查逻辑,避免读取的行数超过数组长度时发生越界访问,引发未定义行为
内容的提问来源于stack exchange,提问作者user12421304
相关产品推荐
相关产品推荐

