質問
int main ()
{
int * b;
b = (int*) malloc (1);
*b=110000;
free (b);
return 0;
}
なぜヒープの腐敗が起こるのか free (b);
?
IMO、ヒープの腐敗はすでに発生しています *b=110000;
.
解決
malloc()
の議論は、割り当てるバイト数です。使用する必要があります:
b = (int*) malloc(sizeof(int));
ブロックが小さすぎると割り当てられてから、割り当てられたよりも多くのバイトを書き込み、ブロックの横に簿記情報を上書きし、ヒープを破壊します。
他のヒント
*b = 110000です。 1つのバイトにメモリを割り当ててから、複数のバイトであるITにINTを割り当てるからです。 b =(int *)malloc(sizeof(int))を使用するか、int *bの代わりにchar *bを使用してから、mallocedポインターをchar *にキャストできます。 128(署名されたcharのため)未満の値を *bに割り当てると、コードは機能する場合があります。
編集: - 私は時々これでさえ手間なしで動作すると思います。コンパイラは、データを迅速にアクセスするために複数のバイトのメモリを割り当てることを選択できるためです。
ヒープの腐敗は実際にすでに起こっています *b=11000
割り当てですが、それはまで検出されません free(b)
それがヒープの完全性が再びチェックされる最初のポイントであるため、呼び出します。
すべての割り当て(または、控えめなポインターを含むすべての割り当て)でヒープの整合性を確認すると、ほとんどのプログラムが遅くなりすぎて、コンパイラをライブラリの実装に強く結び付けます。そのため、整合性チェックは、ヒープが操作されたときにのみ実行されます。 malloc
と free
関数(および友人)。
コードは、使用可能なスペースよりも多くのデータをメモリブロックに書き込みます。したがって、次の有効なメモリブロックの開始が破損します。
int *ではなくchar *を使用し、値-128〜127から * bを書く必要があります。