From ruby-ext-admin@ruby-lang.org Thu Jul 8 19:48:05 2004 Received: from kankan.nagaokaut.ac.jp (kankan.nagaokaut.ac.jp [133.44.2.24]) by blade.nagaokaut.ac.jp (8.12.3/8.12.3/Debian-6.6) with ESMTP id i68Am5Zu005697; Thu, 8 Jul 2004 19:48:05 +0900 Received: from funfun.nagaokaut.ac.jp (funfun.nagaokaut.ac.jp [133.44.2.201]) by kankan.nagaokaut.ac.jp (Postfix) with ESMTP id 4B2D059C3; Thu, 8 Jul 2004 19:48:06 +0900 (JST) Received: from localhost (localhost.nagaokaut.ac.jp [127.0.0.1]) by funfun.nagaokaut.ac.jp (Postfix) with ESMTP id CEC7FF04866; Thu, 8 Jul 2004 19:48:08 +0900 (JST) Received: from voscc.nagaokaut.ac.jp (voscc.nagaokaut.ac.jp [133.44.1.100]) by funfun.nagaokaut.ac.jp (Postfix) with ESMTP id 8E41AF04842; Thu, 8 Jul 2004 19:48:07 +0900 (JST) Received: from lithium.ruby-lang.org (lithium.ruby-lang.org [210.251.121.211]) by voscc.nagaokaut.ac.jp (Postfix) with ESMTP id 22EFB630084; Thu, 8 Jul 2004 19:48:06 +0900 (JST) Received: from lithium.ruby-lang.org (lithium.ruby-lang.org [127.0.0.1]) by lithium.ruby-lang.org (Postfix) with ESMTP id BC746C67A5; Thu, 8 Jul 2004 19:20:14 +0900 (JST) Delivered-To: ruby-ext@ruby-lang.org Date: Thu, 08 Jul 2004 19:20:13 +0900 From: nobu.nakada@nifty.ne.jp Reply-To: ruby-ext@ruby-lang.org Subject: [ruby-ext:02285] Re: OpenCV To: ruby-ext@ruby-lang.org (ruby-ext ML) Message-Id: <200407081020.i68AKDkb002036@sharui.nakada.niregi.kanuma.tochigi.jp> In-Reply-To: <20040708180513.9C08.MASAKAZU@remus.dti.ne.jp> References: <20040707190444.7920.MASAKAZU@remus.dti.ne.jp> <200407071141.i67Bfdkb013727@sharui.nakada.niregi.kanuma.tochigi.jp> <20040708180513.9C08.MASAKAZU@remus.dti.ne.jp> X-ML-Name: ruby-ext X-Mail-Count: 02285 X-MLServer: fml [fml 4.0.3 release (20011202/4.0.3)]; post only (only members can post) X-ML-Info: If you have a question, send e-mail with the body "help" (without quotes) to the address ruby-ext-ctl@ruby-lang.org; help= User-Agent: Wanderlust/2.10.0 (Venus) SEMI/1.14.4 (Hosorogi) FLIM/1.14.4 (=?ISO-8859-4?Q?Kashiharajing=FE-mae?=) APEL/10.4 MULE XEmacs/21.4 (patch 12) (Portable Code) (i386-redhat-linux) Mime-Version: 1.0 (generated by SEMI 1.14.4 - "Hosorogi") Content-Type: text/plain; charset=ISO-2022-JP Precedence: bulk Lines: 89 List-Id: ruby-ext.ruby-lang.org List-Software: fml [fml 4.0.3 release (20011202/4.0.3)] List-Post: List-Owner: List-Help: List-Unsubscribe: X-Virus-Scanned: by AMaViS snapshot-20020531 なかだです。 なかだです。 At Thu, 08 Jul 2004 18:30:43 +0900, 米倉正和 wrote in [ruby-ext:02284]: > // wrap => IplImageをRubyのオブジェクトでwrapする場合に使う > VALUE Object_IplImage::wrap(IplImage *ptr){ > VALUE object = alloc(RubyClass); > (IplImage*)DATA_PTR(object) = ptr; > return object; > } ここで、IplImage*と元になるVALUEを持つ構造体を間に入れるという ことです。 class Object_IplImage { private: IplImage* image; VALUE origin; public: Object_IplImage(IplImage *ptr, VALUE orig = 0) : image(ptr), origin(orig) {} VALUE wrap(); }; VALUE Object_IplImage::wrap() { VALUE object = alloc(RubyClass); DATA_PTR(object) = (void *)this; return object; } これだとほとんどのメソッドで間接参照が一回増えることになるので、 それがいやならばIplImage*から元のVALUEへのハッシュを使うという 方法もあります。 class Object_IplImage { private: static st_table *origin; static void mark(void *); static void free(void *); }; st_table *Object_IplImage::origin = st_init_numtable(); VALUE Object_IplImage::alloc(VALUE self) { return Data_Make_Struct(self, IplImage, mark, free, 0); } void Object_IplImage::mark(void *ptr) { st_data_t val; if (st_lookup(origin, (st_data_t)ptr, &val)) rb_gc_mark((VALUE)val); } void Object_IplImage::free(void *ptr) { st_data_t img = (st_data_t)ptr; st_delete(origin, img, 0); xfree(ptr); } もう一つ、ちょっと気になったのですが、これではalloc()で確保され たIplImageはinitialize()で上書きされてしまい、メモリリークしま せんか。 > // 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; > } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦