1

我想知道为什么valgrind说:

    ==9952== 30 bytes in 6 blocks are definitely lost in loss record 1 of 1
    ==9952==    at 0x4C2BF0E: realloc (vg_replace_malloc.c:662)
    ==9952==    by 0x40131F: setCharsPositions (paramsExec.c:99)
    ==9952==    by 0x400CF3: main (main.c:87)

我无法弄清楚我的问题是什么realloc()(您不必说每次重新分配内存效率低下......);变量char **passwordSet2是全局的——也许这就是问题所在……如果我做错了什么,请告诉我!我要疯了!

void setCharsPositions(char *charsPos){

    int i, k;
    char *posStr = NULL;

    for(i = 0; i < strlen(charsPos); i++){

        posStr = malloc(sizeof(char));

        if(charsPos[i] == '['){

            for(k = 0, i++; charsPos[i] != ','; i++, k++){
                posStr[k] = charsPos[i];
                posStr = realloc(posStr, (k+2)*sizeof(char));
            }
            posStr[k] = '\0';

            passwordSet2[atoi(posStr)-1] = malloc(sizeof(char));
            for(k = 0, i++; charsPos[i] != ']'; i++, k++){
                passwordSet2[atoi(posStr)-1][k] = charsPos[i];
                passwordSet2[atoi(posStr)-1] = realloc(passwordSet2[atoi(posStr)-1], (k+2)*sizeof(char));
            }
            passwordSet2[atoi(posStr)-1][k] = '\0';
        }
        free(posStr);
    }
}
4

1 回答 1

-1
passwordSet2[atoi(posStr)-1] = malloc(sizeof(char));

如果passwordSet2[atoi(posStr)-1]先前已分配,则会泄漏内存。也就是说,如果 posStr 的相同值出现不止一次,则您有泄漏。丢失的内存将来自以前的 realloc,这就是 valgrind 将报告的内容。(如果您指出哪一行是第 662 行,这将有所帮助。)如果 posStr 的相同值不止一次出现但不应该出现,那么您需要检查这一点。如果允许多次发生,那么你应该添加一个调用free

free(passwordSet2[atoi(posStr)-1]);
passwordSet2[atoi(posStr)-1] = malloc(sizeof(char));

的第一次出现free,当passwordSet2[atoi(posStr)-1]为 NULL 时,是一个无操作。

此外,您不会检查 malloc 和 realloc 的 NULL 返回,尽管它们会导致您的程序崩溃,而不仅仅是泄漏。

最后,为了清晰和可能的效率,我敦促您将 atoi(posStr)-1 放入一个变量中,而不是重复它。

于 2013-07-09T04:35:21.027 回答