2013-06-13 108 views
2

我做一些学习与C,和我有麻烦识别内存泄漏情况Cppcheck:(错误)资源泄漏

当我检查与cppcheck代码:得到(错误)资源泄漏:F

enum bus_type { 
    MEDIA_BUS_UNKNOWN, 
    MEDIA_BUS_VIRTUAL, 
    MEDIA_BUS_PCI, 
    MEDIA_BUS_USB, 
}; 

static enum bus_type get_bus(char *device) 
{ 
     char file[PATH_MAX]; 
     char s[1024]; 
     FILE *f; 

     if (!strcmp(device, "/sys/devices/virtual")) 
       return MEDIA_BUS_VIRTUAL; 

     snprintf(file, PATH_MAX, "%s/modalias", device); 
     f = fopen(file, "r"); 
     if (!f) 
       return MEDIA_BUS_UNKNOWN; 
     if (!fgets(s, sizeof(s), f))  /* <-- (error) Resource leak: f */ 
       return MEDIA_BUS_UNKNOWN; 
     fclose(f); 

     if (!strncmp(s, "pci", 3)) 
       return MEDIA_BUS_PCI; 
     if (!strncmp(s, "usb", 3)) 
       return MEDIA_BUS_USB; 

     return MEDIA_BUS_UNKNOWN; 
} 

我觉得我错过了一些内存管理。

+1

您应该在第二种情况下返回'MEDIA_BUS_UNKNOWN'之前关闭'f'。 – sapi

回答

3

您需要fclose文件,该文件在函数前面编辑过,否则您会泄漏FILE*指定的资源。

例如:

if (!fgets(s, sizeof(s), f)) { 
    fclose(f); 
    return MEDIA_BUS_UNKNOWN; 
} 

希望这有助于!