2011-11-19 81 views
0

我有一段简单的程序多数民众赞成在目前生产根据Valgrind的一些内存泄漏,我不知道为什么:内存泄漏下用的fopen

char *filename = strrchr(argv[3], "/") + 1; 
file = fopen(fileName, "w"); 

所以据我所知,我给程序为“test/test2”的argv [3],第一行找到最后一次出现的“/”,然后向前移动一个字符(到“t”)。然后第二行打开一个指向char数组“test”的指针的文件。

为什么会造成内存泄漏?

+3

你从哪儿听到它会导致内存泄漏? – sarnold

+2

此代码不会导致内存泄漏。 –

+0

我没有在任何地方看到'new'或'malloc'。 –

回答

5

那么,你的代码会泄漏一个文件句柄(后一个fopen没有关闭)。然而,没有一个更完整的例子很难说。

4

如果使用打开的文件流,标准I/O库很可能会为流分配一个缓冲区。如果您没有明确关闭该流,那么很有可能valgrind将该内存视为仍在使用;有外部机会会被视为泄漏。

什么是从valgrind确切消息?你为什么指着fopen()

考虑这个简单的程序:

#include <stdio.h> 

static void leaky(void) 
{ 
    FILE *fp = fopen("/etc/passwd", "r"); 
    char buffer[2048]; 
    while (fgets(buffer, sizeof(buffer), fp) != 0) 
     fputs(buffer, stdout); 
    /* fclose(fp); */ 
} 

int main(void) 
{ 
    leaky(); 
    return 0; 
} 

它产生输出摘要:

==6169== 
==6169== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 5 from 1) 
==6169== malloc/free: in use at exit: 568 bytes in 1 blocks. 
==6169== malloc/free: 1 allocs, 0 frees, 568 bytes allocated. 
==6169== For counts of detected errors, rerun with: -v 
==6169== searching for pointers to 1 not-freed blocks. 
==6169== checked 69,424 bytes. 
==6169== 
==6169== LEAK SUMMARY: 
==6169== definitely lost: 0 bytes in 0 blocks. 
==6169==  possibly lost: 0 bytes in 0 blocks. 
==6169== still reachable: 568 bytes in 1 blocks. 
==6169==   suppressed: 0 bytes in 0 blocks. 
==6169== Reachable blocks (those to which a pointer was found) are not shown. 
==6169== To see them, rerun with: --show-reachable=yes 

有了不注释掉fclose(fp),输出为:

​​