2011-10-18 8 views
3

私は、メモリをリークするプログラムを書く必要がある宿題に取り組んでいます。クラッシュするまでどのくらいのメモリが漏れているかを把握しています。どのくらいのメモリが漏れているかを把握するには?

プログラムの一般的な考えは、mallocポインタを継続的に再割り当てすることです。ここで

は、これまでの私のコードです:

char *oldMemory = malloc(125000); //1MB of memory. 
char *newMemory = malloc(125000); 
oldMemory = newMemory; 
  • がループでこれを置くための方法であるとプログラムは、もはや任意のメモリやクラッシュを割り当てることができるまで繰り返しメモリの 一定量を孤立んですか?
  • プログラムがクラッシュする前に、どのくらいのメモリが漏洩したかを追跡するにはどうすればよいですか?

時間と専門知識をお寄せいただきありがとうございます。

+1

malloc(125000) 'は125,000バイト、つまり約122KBです。 1MB近くはありません。 –

+0

あなたはそうです。私はそれを[WolframAlpha](http://www.wolframalpha.com)に入力してその値をバイトに変換しました。代わりにメガビットを使用したに違いありません。 –

+0

ちょうど楽しいために: 'while(new int);' –

答えて

4
  1. はい。
  2. リークされた割り当てのサイズを数えます。

各繰り返しで漏れたサイズを印刷することを忘れないでください。プログラムがクラッシュしても結果が表示されます。失敗した割り当てをテストしてからアクセスする前に、プログラムをクラッシュさせないでください。

したがって:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

enum { ALLOCSIZE = 125000 }; 

int main(void) 
{ 
    long long size = 0; 
    char *space = malloc(ALLOCSIZE); 
    while (space != 0) 
    { 
     size += ALLOCSIZE; 
     printf("OK %lld\n", size); 
     memset(space, '\0', ALLOCSIZE); 
    } 
    return(0); 
} 

、LinuxのOOMは、物事を混乱させる可能性があります。メモリの過度のコミットメントを可能にします。あなたはそれを漏れさせる前に割り当てられたメモリにアクセスしなければならないでしょう - したがってmemset()(またはmalloc()の代わりにcalloc()を使うことができます)。

+0

私はこのコードをallocsizeでlong long = 12500000000000000とし、メモリ使用量は192,248KBにピークを迎えました。私はWindows 7でこれを実行しています。 –

+0

'malloc' /' free'を直接使うのではなく、 "未処理のバイト"変数を追加/減算する独自の関数を書くことができます。これらの関数を定義したファイルの中に、この変数を静的に保つことは理にかなっています。この方法では、値がゼロ以外の値になると、解放せずに何かを割り当てたことがわかります。 –

0

Cでメモリブロックを割り当てる場合は、 free()機能を使用してメモリを解放する必要があります。
メモリリークのためにプログラムがクラッシュしないようにする場合は、
assert()機能を使用すると、より多くのメモリを要求したり、割り当てられたメモリを使用したりすることができます。
mallocから返された返されたポインタをチェックする必要があります。NULLの場合、割り当ては失敗します。 >> Linuxカーネルには注意してください。malloc()は、 "memory overcommit"のためNULLを返すことはありません。

+0

彼はメモリをリークしようとしていて、メモリのリークを追跡する必要があります。 –

関連する問題