From: m-ohkubo@... (Mitsuhiko OHKUBO) Date: 2007-07-09T01:55:10+09:00 Subject: [ruby-dev:31168] 構造体オブジェクトのcloneメソッド呼び出しでメモリリーク発生 大久保といいます。はじめまして。 ruby-1.8.6-p36にてメモリリークと思しき現象を発見しましたので、 お知らせします。というか、現バージョンのバグ報告はこちらなのでしょ うか???よろしくご教授ください。 【手順】 $ cat memleak.rb #! /usr/local/bin/ruby a = Struct.new(:aaa, :bbb, :ccc).new(1, 2, 3) while true a.clone GC.start end $ ruby -v memleak.rb ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-freebsd6.2] 【現象】 topコマンドでrubyプロセスのSIZE値が増加していく。200MBytesあたり までは確認。 【原因】 struct.c:368でALLOC_Nによって確保されたメモリへのポインタが、 struct.c:560で上書きされてしまう。メモリの開放はなし。 【回避策】 次の修正で現象が発生しないことを確認(ただし、適切ではない)。 Index: struct.c =================================================================== RCS file: /usr/home/cvsroot/cmdtools/ruby/struct.c,v retrieving revision 1.1.2.1.2.1 diff -u -r1.1.2.1.2.1 struct.c --- struct.c 11 Jun 2007 16:05:30 -0000 1.1.2.1.2.1 +++ struct.c 8 Jul 2007 16:03:11 -0000 @@ -557,7 +557,7 @@ if (!rb_obj_is_instance_of(s, rb_obj_class(copy))) { rb_raise(rb_eTypeError, "wrong argument class"); } - RSTRUCT(copy)->ptr = ALLOC_N(VALUE, RSTRUCT(s)->len); + REALLOC_N(RSTRUCT(copy)->ptr, VALUE, RSTRUCT(s)->len); RSTRUCT(copy)->len = RSTRUCT(s)->len; MEMCPY(RSTRUCT(copy)->ptr, RSTRUCT(s)->ptr, VALUE, RSTRUCT(copy)->len); ----