2012-02-25 7 views
0

私はマルチレベルキャッシュシミュレータを作成しました。最高のパフォーマンスキャッシュを見つけるために、私はかなり長い間ループするループを作成しました。mallocとフリーループ。オブジェクトはおそらく解放された後に変更されました。

各ループは、malloc関数で、メモリを割り当てるされているので、私はそれをmallocさ何でも解放され、私が実行したときに、私はこのエラーを取得:

解放されたオブジェクトのための」間違ったチェックサム - オブジェクトはおそらく、解放された後に変更されました

/* cache1 */ 
if (S1 == 0) { 
    L1 = 1; 
    d_Cache1.cache_Array = (aBlock *)malloc((int)pow(2, (C1-B1)) * sizeof(aBlock)); 
    /* static int cache1[(int)pow(2,(C1 - B1))]; */ 
} else if (S1 == C1-B1) { 
    L1 = 2; 
    f_Cache1.cache_Array = (aBlock *)malloc((int)pow(2, (C1-B1)) * sizeof(aBlock)); 
} else { 
    L1 = 3; 
    s_Cache1.cache_Array = malloc((int)pow(2, (C1 - S1 - B1))*sizeof(aBlock *)); 
    if(s_Cache1.cache_Array == NULL){ 
     fprintf(stderr, "out of memory\n"); 
     return; 
    } 

    for (i = 0; i < (int)pow(2, (C1 - S1 - B1)); i++) { 
     s_Cache1.cache_Array[i] = malloc((int)pow(2, S1) * sizeof(aBlock)); 
     if (s_Cache1.cache_Array[i] == NULL) { 
      fprintf(stderr, "out of memory\n"); 
      return; 
     } 
    } 

    sc_Count1 = malloc((int)pow(2,S1) * sizeof(aBlock)); 
    for (i = 0; i < (int)pow(2, S1); i++) { 
     sc_Count1[i] = 0; 
    } 
} 
012:それはメモリを割り当て、ここで "

は、ここでは、コード

の一部はここにいます

、すべてを実行した後、それが解放されます:

//cache1 
if (S1 == 0) { 
    free(d_Cache1.cache_Array); 
} else if (S1 == C1-B1) { 
    free(f_Cache1.cache_Array); 
} else { 
    for (i = 0; i < (int)pow(2, (C1 - S1 - B1)); i++) { 
     free(s_Cache1.cache_Array[i]); 
    } 

    free(s_Cache1.cache_Array); 
    free(sc_Count1); 
} 

このメモリの問題を引き起こしている可能性がありますか? 私は割り振った正確なメモリを解放しており、値はS1C1B1は次のループまで変更されません。

+1

フォーマットを整理できますか。 –

+0

あなたがLinuxを使っているなら、Valgrindを使ってこれを見つけて、脳の炎症を止めてください:) – JimR

答えて

1

おそらく問題は中にあります。少なくとも、私はあなたがmallocのメモリを使って何かをするかはわかりません。あなたは配列をゼロにしていますか、それとも他の何かをしていますか? incorrect checksum for freed object - object was probably modified after being freedは、あなたがmallocされたメモリ(つまり、範囲外のインデックス)のまわりでメモリの内容を壊したり、それを解放した後にメモリの内容を変更したりすることで、何が起こっているのかがわかります。

デバッグモードのとき、一部のコンパイラはメモリの周りにチェックサムを入れて解放された後に変更されるかどうかを確認し、修正するとチェックサムと一致しません。コンパイラは、あなたが解放したメモリチャンクの内容を乱していることを伝えています。多くの場合、チェックの余分なコストは、割り当てまたは解放するときにのみ発生します。そのため、これらの呼び出しに関連付けられているように見えます。

あなたはmallocを追跡していても問題ありませんが、次に見ていくのは、あなたが書き込むときのメモリの状態です。

0

s_Cache1.cache_Array = malloc関数(...

次いで

s_Cache1.cache_Array [I] =のmalloc(..

私の目では少し疑わしいと思う。malloc何かの中の何かがすでにマロイd?

+2

これは実際にはかなり一般的です。 'malloc'はポインタの配列、そして' malloc'は各要素です。 –

+0

ありがとう、私はそれがあなたができるものかどうか尋ねるつもりでした。 – Simon

関連する問題