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()わかりません(毎回メモリを1つずつ再割り当てするのは非効率的であると言う必要はありません...)。変数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 の同じ値が複数回発生すると、リークが発生します。失われたメモリは以前の再割り当てによるものであるため、それが valgrind によって報告されます。(行 662 を指摘していただけると助かります。) posStr の同じ値が複数回発生しているが、発生することが想定されていない場合は、それを確認する必要があります。複数回発生することが許可されている場合は、次の呼び出しを追加する必要がありますfree

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

freeが NULL の場合、最初に出現passwordSet2[atoi(posStr)-1]する はノーオペレーションです。

また、malloc と realloc からの NULL リターンをチェックしていませんが、それらはプログラムをクラッシュさせるだけでなく、リークする原因にもなります。

最後に、明確さと効率性のために、atoi(posStr)-1 を繰り返すのではなく、変数に入れることをお勧めします。

于 2013-07-09T04:35:21.027 に答える