近日一直用C语言写代码,今天接近完工,用mtrace找了下内存泄漏。发现了几件值得记录的事情:
1. fopen()产生的FILE*实际指向的是一个FILE结构体,这个结构体在fopen里面是通过malloc生成出来的,所以,是应该释放掉的。释放的方法不是调用free,而是调用fclose().就是说如果你先在某个地方写了
FILE *fp=fopen("XXXXXX","r");
那么一定得在某个另外的地方做下面的事情
fclose(fp); fp=NULL;
不做就会内存泄漏。
2. GNU libc 有个扩展库函数叫getline()的,用来从文本文件里面逐行读取文本很方便。但是这个函数每次启动的时候都会生成一个读取缓冲区,即便读取失败,这个缓冲区也会生成,并且这个缓冲区的指针会被参数 char **lineptr所指向的指针返回。所以,如果你是用这个玩意读取文本文件,并且是用返回值是否>=0来判断文件是否读取完成,那么一定得记得释放掉每次读取的这个缓冲区,特别是读到文件结束,返回读取长度为-1的时候,那个缓冲区指针也得free掉。具体来说就是这么个样子,特别注意其中重要的那几行。
while(......) { char *tmpLine = NULL; size_t tmpLength = 0; size_t tmpXL = getline(&tmpLine,&tmpLength,fp); /*Important code!*/ if ((int)tmpXL == -1) { free(tmpLine); tmpLine = NULL; break; } /*Important code complete.*/ }
3. strdup(),这个函数复制出来的字符串,当然得自己手动释放掉,否则就会内存泄漏了。