空き(位置)を実行しているときに問題が発生しています。mallocを使用してC/C++でfreeを使用しているときにエラーが発生する。HEAP CORRUPTION DETECTED
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ループとwhileループを除いたものと同じです。これは機能します。 forループを削除すると、それが機能しました。どうしてか分かりません。私はCRTのことを調べましたが、それはまったく新しい概念でしたが、私はこれらのCRTについて知らずにこの問題を解決できると考えています。
forループは、位置のために割り当てられたメモリに値を割り当てます。なぜなら、これがなぜ問題を引き起こすのか考えることはできません。実際は今私はそれについて考えています。ループを高さ+ 1に変更して問題を修正しました。
callocを使用していただきありがとうございます。一貫性のために<= inループを使用することは避けています。私はそれが私が持っていた問題のために変更したと思うし、物事を試してみる。 – MykC
実際、あなたの答えは、OPのコードから醜い、潜在的に有害なキャストを削除する必要があります。 –
@R、良い提案。タイトルはC/C++と言っていますが、質問にCと書かれていますので削除しました。 –