[解決済み] 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
}
関連
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み】malloc()とfree()はどのように動作するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン