2012-04-29 15 views
-3

このコードは、Visual Studio 2010に対応するヒープの破損を引き起こします。 ヒープ破損の原因は何ですか?このコードのどの部分が原因ですか?大きなメモリ割り当てサイズのヒープ破損C++

#define size 65536 
int main() 
{ 
    int* a = new int[size];//size is equal to 
    srand(time(NULL)); 
    for(int i = 0 ; i < size; i++) 
    { 
     a[i]= 1 + rand() % 10; 
    } 

    for(int i = 0; (size/2)/pow((double)2, i)>= 1; i++) 
    { 
     int n = pow((double)2, i); 
     int offset = 0; 
     for(int j = 0; j < (size/2)/pow((double)2, i); j++) 
     { 
      int* tmp = new int[n]; 
      merge(a + offset, n, a + offset + n, n, tmp); 
      memcpy(a + offset, tmp, n*2 * sizeof(int)); 
      offset += pow((double)2, i+1); 
     } 
    } 

    for(int i = 0; i < size; i++) 
    { 
     cout<<a[i]<<" "; 
    } 
    cout<<endl; 
    system("PAUSE"); 
    return 0; 
} 
+1

「マージ」とは何ですか? –

+2

また、メモリリークがあります。 'tmp'が指すメモリを解放することは決してありません。 –

+0

ボイドマージするための(INT * A、INT a_size、INT * B、INT B_SIZE、INT * C) { \t(INT a_iを= 0、b_i = 0、C_I = 0; C_I Nashwan

答えて

3

memcpyが問題であると思われます。 tmpから(n * 2 * sizeof(int))バイトをコピーしていますが、n * sizeof(int)しか割り当てませんでした。

1

ヒープの破損は、メモリのblcokを割り当てた後、そのブロックの外にデータを書き込んだことを意味します。通常、これは配列の最後を過ぎて書いたことを意味します。

少量の上書きは、メモリ割り当て後に配置される「ガードワード」にヒットするため、ランタイムはプログラムが正常に実行されている間にanbdレポートヒープの破損を検出します。ただし、さらに書き込むと、他の一部の重要なデータが破損して(プログラムがデータを使用しようとしたときに未定義の結果が発生する)、メモリマップの末尾に致命的なアクセス違反エラーが発生する可能性があります。あなたが使用した最大のインデックスがどのようなものになるかを計算することができない場合は、あなたの配列へのインデックスが範囲内に常にあることを

チェック0..Lengthは-1

、その後、ことを確認するためのコードの行を置きますインデックスはこの範囲内にあり、そうでない場合はデバッガに侵入します。つまり、merge/memcpyに渡す値が常に範囲内にあることを確認します。 (1つの要素をあまりにも多く書き込む可能性があります。これは、必要なメモリよりも少しだけメモリを割り当てることですが、明らかに正しい解決策ではありません。意図したデータだけを書き込むようにする必要がありますあなたがtmpのための十分なスペースが割り当てられていないと)

1

int* tmp = new int[2*n]; 

増分をマージコードfor (..; ...; c_i++には)あまりにも非常に疑わしいです。

おそらく2つのバグがあります。デバッガを使用するか、トレースメッセージを書き、何が起こっているかを確認してください。

+0

いいえ、私はしなかった...ありがとう – Nashwan

関連する問題