2010-12-08 12 views
1

最近、Cコードでメモリリークを処理しています。私は、異なるハードウェアアーキテクチャで異なるメモリリークを見ることに驚いています。異なるハードウェアアーキテクチャでメモリリークが異なる

以下は夏64ビットアーキテクチャにvalgrindので示すリークである:

   LEAK SUMMARY: 
     ==4064== definitely lost: 1,600,192 bytes in 7 blocks 
     ==4064== indirectly lost: 0 bytes in 0 blocks 
     ==4064==  possibly lost: 0 bytes in 0 blocks 
     ==4064== still reachable: 3,217,416 bytes in 2,155 blocks 
     ==4064==   suppressed: 0 bytes in 0 blocks 
     ==4064== Reachable blocks (those to which a pointer was found) are not shown. 
     ==4064== To see them, rerun with: --leak-check=full --show-reachable=yes 
     ==4064== 
     ==4064== For counts of detected and suppressed errors, rerun with: -v 
     ==4064== ERROR SUMMARY: 7 errors from 7 contexts (suppressed: 4 from 4) 

そして以下がその理由であることができるどのような32ビットアーキテクチャ

 LEAK SUMMARY: 
    ==29607== definitely lost: 1,600,048 bytes in 4 blocks . 
    ==29607== indirectly lost: 456 bytes in 33 blocks. 
    ==29607==  possibly lost: 0 bytes in 0 blocks. 
    ==29607== still reachable: 96 bytes in 12 blocks. 
    ==29607==   suppressed: 0 bytes in 0 blocks. 
    ==29607== Reachable blocks (those to which a pointer was found) are not shown. 
    ==29607== To see them, rerun with: --show-reachable=yes 

するためのものです。

+2

出力は通常終了プログラム用ですか?失敗したときに存在すると、別の場所で失敗する可能性があります。クラッシュは通常メモリ管理と関係がありますが、アーキテクチャごとに前後でクラッシュする可能性があります。また、64ビットでは通常32ビット(つまりポインタのサイズなど)よりも多くのメモリを使用することに注意してください。 –

+0

アーキテクチャのいずれかでメモリリークを防ぐことができたら、どちらのアーキテクチャでも動作しますか? – thetna

+1

正しいプログラムは漏れません:) –

答えて

4

まあ、正確な内容はわかりませんが、いくつかのタイプのサイズに基づいたデータが漏れた場合、リークは64ビットの場合、 32ビット。 int *のサイズは、プラットフォームに依存するため、リーク(32ビットと比較して)64ビットに大きくなり

// arr holds an array of 10 pointers 
int *arr = malloc(10 * sizeof(int *)); 

:データのこの部分を漏れたとえば

、。

2

おそらく、64ビットマシンのライブラリにいくつかのバグがありますか?

また、コードの一部が32ビット整数にポインタをキャストして戻ってしまい、怪我を引き起こすことがあります。

1

アレイのオーバーランや無効なポインタを介したデータ書き込みのようなものがある場合は、異なるマシン上のメモリのレイアウトが異なることが予想されます。あなたがそうならば:

void * foo(void) { 
    char str[100]; 
    void * p = malloc(100); 
    memset(str, 0, 111); 
    /* ... more code ... */ 
    return p; 
} 

次に、strとpの両方がスタックにあると想像することができます。それらがレイアウトされる順序は異なるかもしれませんし、スタックにいくつの余分なバイトが割り当てられているかもしれないので、memsetの長さのエラーは新しく割り当てられたメモリへの参照を失うかもしれません。 。他の多くのものに応じて、memsetエラーはvalgrindによって気付かれるかもしれませんが、私は理解しやすい簡単なケースを使用する必要がありました。

これは起こっていることと似ているかもしれないし、そうでないかもしれないが、私はそれが起こりうるもののタイプを実証していると思う。

関連する問題