(U) Rubin Extensions: rb_gc_mark () und Instanzvariablen
-
13-09-2019 - |
Frage
Ich schreibe eine Ruby-Erweiterung, die eine Klasse definiert.
Wenn ich Data_Wrap_Struct()
benutze mein Rückruf für rb_define_alloc_func()
zu implementieren, muss ich manuell markieren und die Instanzvariablen befreien? Oder ist das für mich nach wie vor behandelt?
Lösung
Rubys GC wird alle Ruby-Objekte sammeln, die in Ihrem Ruby-Objekt Instanzvariablen referenziert werden. Sie haben nicht zu, und sollte nicht, frei Ruby-Instanz-Variablen selbst (das heißt alle Objekte mit rb_iv_set()
/ rb_iv_get()
in Ihrer Erweiterung zugegriffen wird).
Wenn jedoch die eingewickelt C struct Referenzen Ruby-Objekte, dann werden Sie das in dem mark
Rückruf markieren müssen Sie Data_Wrap_Struct()
sind vorbei.
(Und Sie werden immer die zugrunde liegende Struktur befreien müssen und tun andere Bereinigungs, die erforderlich sein können, wie Schließen von Dateien, Steckdosen usw. in Ihrem free
Rückruf.)