【问题标题】:Cppcheck: (error) Resource leakCppcheck:(错误)资源泄漏
【发布时间】:2013-06-13 01:27:23
【问题描述】:

我正在学习一些 C 语言,但无法识别内存泄漏情况

当我用 cppcheck 检查代码时:get (error) Resource leak: 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;
}

我觉得我在内存管理方面遗漏了一些东西。

【问题讨论】:

  • 在第二种情况下,您应该先关闭f,然后再返回MEDIA_BUS_UNKNOWN

标签: c memory-leaks


【解决方案1】:

你需要fclose你在函数前面有fopened的文件,否则你会泄露FILE*分配和指向的资源。

例如:

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多