From: Koji Oda Date: 2000-02-07T12:07:26+09:00 Subject: [ruby-dev:9133] ruby-1.4.3 memory leak 小田@QNES です。 リークチェックツールでチェックしてみました。 ruby 1.4.3 (1999-12-08) [i386-mswin32] 動かしたスクリプトは、sample/test.rb です。 添付したパッチの他にも、 メモリ リーク 1132 バイト 次の場所でアロケート malloc の ruby-1.4.3\gc.c (71) メモリ リーク 13 バイト 次の場所でアロケート malloc の ruby-1.4.3\gc.c (107) リソース リーク : 次の場所でアロケート DuplicateHandle の ruby-1.4.3\win32\win32.c (547) リソース リーク : 次の場所でアロケート CreateProcessA の ruby-1.4.3\win32\win32.c (579) リソース リーク : 次の場所でアロケート DuplicateHandle の ruby-1.4.3\win32\win32.c (597) リソース リーク : 次の場所でアロケート DuplicateHandle の ruby-1.4.3\win32\win32.c (542) というのもありました。 こっちは、時間がなくって調べていません。 未初期化メモリの参照も、多数出ていたので、calloc に してみました。 1.4.3 のパッチです。こんな感じで如何でしょう? ----- --- gc.c.org Wed Dec 08 14:35:57 1999 +++ gc.c Tue Feb 01 11:42:18 2000 @@ -243,11 +243,11 @@ heaps_length += HEAPS_INCREMENT; heaps = (heaps_used>0)? (RVALUE**)realloc(heaps, heaps_length*sizeof(RVALUE*)): - (RVALUE**)malloc(heaps_length*sizeof(RVALUE*)); + (RVALUE**)calloc(1, heaps_length*sizeof(RVALUE*)); if (heaps == 0) rb_fatal("can't alloc memory"); } - p = heaps[heaps_used++] = (RVALUE*)malloc(sizeof(RVALUE)*HEAP_SLOTS); + p = heaps[heaps_used++] = (RVALUE*)calloc(1, sizeof(RVALUE)*HEAP_SLOTS); if (p == 0) rb_fatal("add_heap: can't alloc memory"); pend = p + HEAP_SLOTS; if (lomem == 0 || lomem > p) lomem = p; @@ -1151,7 +1151,9 @@ } p++; } + free(heaps[i]); } + free(heaps); } static VALUE --- eval.c.org Wed Dec 08 01:47:15 1999 +++ eval.c Tue Feb 01 10:58:22 2000 @@ -6978,6 +6978,7 @@ th->block = 0;\ th->iter = 0;\ th->tag = 0;\ + th->trace = 0;\ th->errinfo = 0;\ th->last_status = 0;\ th->last_line = 0;\