动态数组:使用realloc()而不会出现内存泄漏

Cec*_*lia 5 c realloc cppcheck

我使用realloc来调整分配的内存:

char **get_channel_name(void)   
{
    char **result;
    int n;

    result = (char **) 0;
    for (elem = snd_mixer_first_elem(handle), n = 0; elem; elem = snd_mixer_elem_next(elem)) {
        if (!snd_mixer_selem_is_active(elem))
            continue;
        if (snd_mixer_selem_has_playback_volume(elem) &&
            snd_mixer_selem_has_playback_switch(elem) &&
            snd_mixer_selem_has_capture_switch(elem)) {
            if (result == (char **) 0)
                result = (char **) malloc(sizeof(char *));
            else
                result = (char **) realloc(result, sizeof(char *) * (n + 1)); /* nulled but not freed upon failure */
            result[n++] = strdup(snd_mixer_selem_get_name(elem));
        }
    }

    if (result == (char **) 0)
        return NULL;

    result = (char **) realloc(result, sizeof(char *) * (n + 1)); /* nulled but not freed upon failure */
    result[n] = NULL;

    return result;
}
Run Code Online (Sandbox Code Playgroud)

当我用cppcheck工具检查代码静态C/C++代码分析时,打印出以下警告:

Common realloc mistake: 'result' nulled but not freed upon failure
Run Code Online (Sandbox Code Playgroud)

如何修复这两个可能的内存泄漏?

alk*_*alk 9

如果realloc()失败则返回NULL.

所以,如果你这样做(假设realloc()会失败)

result = realloc(result, ...);
Run Code Online (Sandbox Code Playgroud)

result将被分配NULL,它指向的内容未被free()编辑,并且要free()编辑的地址将丢失.

要解决这个问题:

void * tmp = realloc(result, ...);
if (NULL == tmp)
{
  /* Handle error case, propably freeing what result is pointing to. */
}
else
{
  result = tmp;
}
Run Code Online (Sandbox Code Playgroud)