米倉です。

> 	img = OpenCV::IplImage.new(100, 100)
> 	target = img.get_matrix(0, 0, 10, 10)
> 	# => img (0,0)の位置から10x10の操作用領域を切り出す
> 	# 例えばtarget.fill(0x000000)でこの部分だけ黒く塗るとか…
> 	target = "hoge" # またはimg = "hoge"として片方をgarbageに
> 	GC::start       # => エラー
* subimg.fillじゃなくてtarget.fillでした。

> 直接IplImageへのポインタを使うのではなく、元になったVALUEも一緒
> に持っておけばいいんじゃないでしょうか。で、GCのときにはそれを
> markしてやると。

理解力不足ですいません。直接IplImageへのポインタを使わないとはどういうこ
とでしょうか。

これが今のソースの一部で、OpenCV::IplImageクラスはCの構造体IplImageを
Wrapしています。

VALUE Object_IplImage::RubyClass;

// Init_opencvで呼び出して宣言
VALUE Object_IplImage::defineRubyClass(){
  RubyClass = rb_define_class_under(GetModuleOpenCV(),
"IplImage",rb_cObject);
  rb_define_alloc_func(RubyClass, alloc);
  rb_define_method(RubyClass, "initialize", RUBY_METHOD_FUNC(initialize),
2);
  ...
}

// wrap => IplImageをRubyのオブジェクトでwrapする場合に使う
VALUE Object_IplImage::wrap(IplImage *ptr){
  VALUE object = alloc(RubyClass);
  (IplImage*)DATA_PTR(object) = ptr;
  return object;
}

// alloc => 領域を確保
VALUE Object_IplImage::alloc(VALUE self){
  IplImage *ptr;
  return Data_Make_Struct(self, IplImage, 0, free, ptr);
}

// initialize
VALUE Object_IplImage::initialize(VALUE self, VALUE width, VALUE height){
  // --- IplImage *imageを作成(省略) ---
  DATA_PTR(self) = image;
  return self;
}


---------------------------------
 [ Kanagawa University ]
 Masakazu Yonekura
 mail: kazu / goto.info.kanagawa-u.ac.jp
---------------------------------