那些你需要记得释放内存的库函数

近日一直用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(),这个函数复制出来的字符串,当然得自己手动释放掉,否则就会内存泄漏了。

此条目发表在软件使用与程序设计分类目录。将固定链接加入收藏夹。