C/C ++でMALLOCおよびFREEを使用し、エラーヒープの破損を検出する
-
28-09-2019 - |
質問
無料(位置)が実行されている場合、私は問題を抱えています。
void printTree(nodeT node, int hieght)
{
int *position;
position = (int*)malloc(hieght * sizeof(int*));
for (int i = 0; i <= hieght; i++)
{
position[i] = 0;
}
BOOLEAN DONE = FALSE;
while (DONE == FALSE)
{
printMoveDown(&node, position);
printLEAFNode(&node, position);
DONE = printMoveUp(&node, position);
printSingleKey(&node, position);
}
free(position);
position = NULL;
}
VS2010から得られる完全なエラーメッセージは、ヒープの破損が検出されました:通常のブロック(#64)の0x00031390の後。 CRTは、アプリケーションがヒープの終了後にメモリに書き込まれたことを検出しました。
デバッガーは、問題はdbgheap.cで発生すると言います
extern "C" void __cdecl _free_dbg_nolock
line 1376: if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
if (pHead->szFileName) {..}
else { this is where the program stops }
同じ状況を設定して、問題を絞り込むことができるかどうかを確認するために、より少ないものを設定しようとしました。
void function (int y)
{
int *x;
x = (int*)malloc(y * sizeof(int*));
free(x);
x = NULL;
}
これは、for loopとwhile loopのない上記と同じです。これは機能します。 forループを削除することが機能しました。どうしてか分かりません。私はCRTが何であるかを調べましたが、それはすべて私にとってかなり新しい概念でした。これらのCRTを知らずにこの問題を解決できると思います。
forループは、位置に割り当てられたメモリに値を割り当てます。それを超えて、これが問題を引き起こす理由を考えることはできません。ループを高さ + 1に変更し、問題を修正しました。
解決
そのはず:
position = malloc(hieght * sizeof(int));
また:
position = malloc(hieght * sizeof *position);
それはあなたがそれを持っている方法で定義されていない行動です。あなたはおそらくただ幸運になっているからです int
と int*
同じサイズです。
そして、ループを書き込む典型的な正しい方法は次のとおりです。
for (int i = 0; i < hieght; i++)
{
position[i] = 0;
}
ここでCallocを使用することもできます:
position = calloc(hieght, sizeof *position);
そして、メモリはあなたのためにゼロになりますので、ループする必要はありません。
また、これが本当にcの場合、キャストは余分です。
他のヒント
ループの問題は<=であるべきだと思います。その結果、ループが1回回数回転しすぎて、ヒープの次のアイテムを破損します!
所属していません StackOverflow