1. ホーム
  2. c

[解決済み] Valgrind 無効な free() / delete / delete[] / realloc() in C

2022-03-01 07:52:16

質問

Valgrindは、メモリにリークがあると教えてくれました。何かアイデアはありますか?ありがとうございます。

<ブロッククオート

無効なfree()/delete/delete[]/realloc() at 0x4C27D4E: free (vg_replace_malloc.c:427)

by 0x400C00: メイン (main.c:149)

アドレス0x51ba138は、サイズ8のブロックが割り当てられた後の0バイトです。

at 0x4C28BED: malloc (vg_replace_malloc.c:263) by 0x400B0E: main (main.c:119)

ヒープサマリー。 終了時に使用中: 1ブロックに2バイト ヒープ使用量の合計。5つの割り当て、5つの解放、14バイトの割り当て

1ブロック中の2バイトは、損失レコードの1/1で確実に失われる

at 0x4C28BED: malloc (vg_replace_malloc.c:263)

by 0x40084F: strdup (main.c:19)

by 0x4009C4: パーミュート (main.c:83)

by 0x400B9C: main (main.c:138)

char *strdup (const char *s)
{
    char *d = malloc (strlen (s) + 1);  // Space for length plus null //line 19
    if (d == NULL) {
        return NULL;            // No memory
    }
    strcpy (d, s);              // Copy the characters
    return d;                   // Return the new string
}

void permute (char *arrayOfPermutations, int startIndex, int stopIndex,
            char ***permuts)
{
    int i;
    if (startIndex == stopIndex) {
        **permuts = strdup (arrayOfPermutations);       //save generated string //line 83
        *permuts += 1;          //increment location
    } else {
        for (i = startIndex; i <= stopIndex; i++) {
            swap ((arrayOfPermutations + startIndex),
                (arrayOfPermutations + i));
            permute (arrayOfPermutations, startIndex + 1, stopIndex, permuts);
            swap ((arrayOfPermutations + startIndex),
                (arrayOfPermutations + i));
        }
    }
}

int main (int argc, char *argv[])
{
    char *stringInput, c = 0;
    unsigned int j = 0, i = 0, stringSize, facto;
    char **permuts, **work;

    stringInput = (char *) malloc (sizeof (char));

    while (c != '\n') {
        c = getc (stdin);       //read the input from keyboard standard input
        stringInput = (char *) realloc (stringInput, (j + 1) * sizeof (char));  //re-allocate (resize) memory for character read to be stored
        stringInput[j] = c;     //store read character by making pointer point to c
        j++;
    }

    stringInput[j - 1] = '\0';  //add null termination
    stringSize = strlen (stringInput);
    facto = factorial (stringSize);

    permuts = (char **) malloc (facto * sizeof (char *));       // allocate n! pointers //line 119
    work = permuts;

    printf ("String size: %d\n", stringSize);

    ...some printfs here...permute (stringInput, 0, stringSize - 1, &work);     //creates permutations of chars //line 138

    qsort (permuts, facto, sizeof (char *), compare);   //sorts strings alphabetically

    for (i = 0; i <= facto - 1; i++) {
        printf ("\"%s\"\n", permuts[i]);
    }

    free (work);                //free the memory //line 149
    free (permuts);             //free the memory
    free (stringInput);         //free the memory
}

解決方法は?

あなたのコードを読む前に。Valgrindが報告する無効な解放エラーは、リークされたメモリが原因ではなく、無効なメモリを解放しようとした(または同じメモリを複数回解放した)ことが原因です。コンパイルフラグ -g (gdb debug) をつけてコンパイルすると、より多くのデバッグ情報を得ることができ、valgrind からのバックトレースをより良くすることができます。

簡単な推測

  ..
  for(i = 0; i <= facto-1; i++)
   {
    printf("\"%s\"\n", permuts[i]);
    free (permuts[i]); /* free the text, allocated with strdup(); */
  }

  free(permuts);//free the memory
  free(stringInput);//free the memory
}