LoginSignup
0
0

More than 1 year has passed since last update.

Ruby-FFIのManagedStructは、ObjectSpace#define_finalizerを利用して、GCにオブジェクトが回収される際に、予め登録されたメモリを解放する関数をFFIで呼ぶ

Last updated at Posted at 2021-12-30

Ruby-FFIでは、C言語の構造体と、Rubyのクラスを関連付けることができる。Rubyのクラスのインスタンスオブジェクトが作成されると、C言語の構造体用のメモリが確保される。しかし、RubyのインスタンスがGCによって回収される時に、C言語の構造体のメモリが解放されるとは限らない。

そこでRuby-FFIでは、RubyのオブジェクトがGCに回収された時に、C言語側でメモリを自動的に解放してくれるクラスManagedStructというものが用意されている。ManagedStructはC拡張でゴリゴリと難しいことをしているのかと思いきや、意外にもシンプルにRubyで実装されている。

その内容を見てみると、ObjectSpace#define_finalizer というものを利用している。これはオブジェクトがGCに回収される時に呼び出されるメソッドのようだ。finalizerが呼ばれた時に、Cのメモリ解放用の関数が発火するようにしておけばいい。

この記事は以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0