Ruby-FFIでは、C言語の構造体と、Rubyのクラスを関連付けることができる。Rubyのクラスのインスタンスオブジェクトが作成されると、C言語の構造体用のメモリが確保される。しかし、RubyのインスタンスがGCによって回収される時に、C言語の構造体のメモリが解放されるとは限らない。
そこでRuby-FFIでは、RubyのオブジェクトがGCに回収された時に、C言語側でメモリを自動的に解放してくれるクラスManagedStruct
というものが用意されている。ManagedStructはC拡張でゴリゴリと難しいことをしているのかと思いきや、意外にもシンプルにRubyで実装されている。
その内容を見てみると、ObjectSpace#define_finalizer
というものを利用している。これはオブジェクトがGCに回収される時に呼び出されるメソッドのようだ。finalizerが呼ばれた時に、Cのメモリ解放用の関数が発火するようにしておけばいい。
この記事は以上です。