[ruby-list:37755] Re: rb_ary_push

From: EMOTO Masahiko <emo@...>
Date: 2003-06-05 04:06:46 UTC
List: ruby-list #37755
教えていただいた方法を試してみましたが、
別のところで落ちてしまいました。
やはりガベージコレクタ関連のようです。

>Program received signal SIGSEGV, Segmentation fault.
>mark_locations_array (x=0x80b77cd, n=-302548858) at gc.c:353
>353     {
>Current language:  auto; currently c

別の方法(なるべくオブジェクトを生成しないようにする)
でインプリメントしてみます。

                      江本

At Wed, 4 Jun 2003 22:13:51 +0900,
nobu.nakada@nifty.ne.jp wrote:
> 
> なかだです。
> 
> At Wed, 4 Jun 2003 20:22:32 +0900,
> EMOTO Masahiko wrote:
> > プログラム中で配列の大きさ(サンプルではN、M)が小さい時は
> > 動作するのですが、大きくすると落ちてしまいます。
> 
> スタック上のGCから保護される範囲から、aryとary2が外れているのだ
> と思います。
> 
> 実際のコードや最適化の具合によって条件は変わりますが、一般的に
> ruby_init()を呼ぶ関数と同じかそれよりも(コールグラフで)上の関数
> では、VALUEを使うのは危険です。rb_ary_new()以降を別関数に分ける
> とうまくいくかも知れません。
> 
> あるいは、Init_stack()をより上位のアドレスで呼び出すとか。
> 
> int
> main(int argc, char **argv)
> {
>   int i,j;
>   VALUE ary,ary2;
>   ruby_init();
>   Init_stack((VALUE*)&argc);  /* <---- ここ */
>   ruby_init_loadpath();
>   ary = rb_ary_new();
>   for(i=0;i<N;i++){
>     ary2 = rb_ary_new();
>     for(j=0;j<M;j++){
>       rb_ary_push(ary2,rb_float_new((double )i));
>       rb_ary_push(ary,ary2);
>     }
>   }
> }
> 
> -- 
> --- 僕の前にBugはない。
> --- 僕の後ろにBugはできる。
>     中田 伸悦
> 

In This Thread

Prev Next