2013-06-10 7 views
5

大きなプログラムでメモリリークが発生しましたが、これがその原因だと思います。charポインタが配列のメモリリークを構造化しています

#include <stdlib.h> 
#include <Windows.h> 

typedef struct _struct{ 
    char* name; 
} str; 

int main() { 
    system("PAUSE"); 

    str* Character = (str*)malloc(sizeof(str) * 20000); 

    for(int i = 0; i < 20000; i++){ 
     Character[i].name = (char*)malloc(20000); // Assign memory. 
    } 

    for(int i = 0; i < 20000; i++){ 
     free(Character[i].name);   // Free memory. 
    } 

    free(Character); 
    system("PAUSE"); 
} 

最初の一時停止時のメモリ:〜500K。

第2ポーズ時のメモリ:〜1.7M。

テスト用にVS2012を使用する。何か案は?

+1

コードが正しいように見えます。あなたはどのようにメモリ使用量を測定していますか?あなたのヒープマネージャは、 'free'への呼び出しに続いてヒープを圧縮していない可能性がありますか?この場合、余分なメモリはプロセスに割り当てられますが、プログラムでは使用されないため、実際には他のコードが割り当てられるようになります。 – simonc

+0

mallocを使うとき、plsはメモリが実際に割り当てられているかどうかを確認してください。(Character == NULL) – hazzelnuttie

+0

mallocから戻り値をキャストすべきではありません。これはCであり、あなたはvoid *を何かに割り当てることができます。 –

答えて

4

どのようにプログラムの占有メモリ量を測定していますか?私の頭の一番上にあるものは、OSが追跡している作業セットのサイズを見ているということです。あなたは多くのメモリを割り当てて解放しているので、そのセットのサイズは増加しています。一部のOSはしばらくして作業セットのサイズを調整しますが、そうでないものもあります。私たちはここでどんなOSを見ているのですか?

+0

Windows 7究極のメモリとタスクマネージャによるメモリの使用 – Marc

+0

Windowsの動作(後でチェックするか、他の人が書き込む可能性があります)は正確にはわかりませんが、期待通りの動作が得られていない可能性があります。現代のオペレーティングシステムは、処理メモリを管理し、処理時間を節約し、ページの割り振りを遅らせる可能性があります。 mallocとfreeの実装はメモリを予約しているかもしれません。本当に確かめたいのであれば、valgrindのようなツールを使って漏れをチェックしてください。 – idoby

+0

DrMemoryで実行したところ、まだ到達可能な319の割り当てで3(1536バイト)のリークが検出されました。 – Marc

3

mallocを呼び出すと、ヒープにメモリが割り当てられます。ヒープに十分な空き容量がない場合、プログラムはOSにさらにメモリを要求し、別のチャンクが取得されます。 OSから取得したメモリは、通常、プログラムが終了するまで返されません(これはOSに依存します)。

プログラムサイズだけでは、通常、メモリリークをチェックすることはできません! Valgrindなどのツールを使用して、決してfreeを取得しないメモリを確認します。

-1

str *文字=(str *)malloc(sizeof(str)* 20000);

上記の行では、構造体のサイズを見つけることによってメモリを割り当てています。ここで得られる構造体のサイズは、charのサイズではなく、ポインタの幅のサイズになります。

たとえば、ポインタの幅が32ビットの場合、(4 * 20000)= 80000バイトが割り当てられます。

あなたは、20000の構造体のために

をstr *キャラクター=(STR *)はmalloc(はsizeof(文字)* 20000)を割り当てたい場合は、

+1

str *文字は構造体の配列であり、文字ではありません。(混乱させる名前は同意できます)sizeof(str)は正しいです。 –

関連する問題