2010-11-26 6 views
2

空き(位置)を実行しているときに問題が発生しています。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に変更して問題を修正しました。

答えて

3

それは次のようになります。

position = malloc(hieght * sizeof(int)); 

か:

position = malloc(hieght * sizeof *position); 

それはあなたがそれを持っている方法未定義の動作です。 intint*は同じサイズなので、あなたはおそらくラッキーです。

、ループを書くための典型的な正しい方法は次のとおりです。

for (int i = 0; i < hieght; i++) 
{ 
    position[i] = 0; 
} 

ます。また、ここではcallocを使用することができます。

position = calloc(hieght, sizeof *position); 

とメモリがあなたのためにゼロになりますので、あなたがいないとループする必要があります。

また、これが実際にCの場合、キャストは余計です。

+0

callocを使用していただきありがとうございます。一貫性のために<= inループを使用することは避けています。私はそれが私が持っていた問題のために変更したと思うし、物事を試してみる。 – MykC

+1

実際、あなたの答えは、OPのコードから醜い、潜在的に有害なキャストを削除する必要があります。 –

+0

@R、良い提案。タイトルはC/C++と言っていますが、質問にCと書かれていますので削除しました。 –

0

私はループ内の問題は< =と思われますが、実際には<であるはずです。 その結果、ループが1回だけ大きくなり、ヒープ上の次の項目が破損します。

+1

これは、ほぼ4年前に受け入れられた回答ですでに指摘されていました。 –

関連する問題