在尝试了 Vala 并检查了生成的 C 源代码后,我想出了以下 Vala 代码:
class Foo : GLib.Object {
public string baz;
}
class Main : GLib.Object {
public static Foo foo;
public static void bar(Foo f) {
foo = null;
f.baz = "Hi";
}
public static int main(string[] args) {
foo = new Foo();
bar(foo);
return 0;
}
}
检查生成的 C 代码后,我意识到 Vala 编译器在将foo传递给bar时没有插入引用计数(RC)增量。据我了解,bar中的第一行会将foo的 RC 递减为 0,这反过来应该释放foo,从而有效地使传递的变量f成为悬空指针,然后在bar的第二行中访问它. 但是,程序执行没有问题,所以我不确定我是否在这里遗漏了一些东西,或者它只是出于巧合。这里生成的C代码供参考:
void main_bar (Foo* f) {
Foo* _tmp0_;
gchar* _tmp1_;
g_return_if_fail (f != NULL);
_g_object_unref0 (main_foo);
main_foo = NULL;
_tmp0_ = f;
_tmp1_ = g_strdup ("Hi");
_g_free0 (_tmp0_->baz);
_tmp0_->baz = _tmp1_;
}
gint main_main (gchar** args, int args_length1) {
gint result = 0;
Foo* _tmp0_;
Foo* _tmp1_;
_tmp0_ = foo_new ();
_g_object_unref0 (main_foo);
main_foo = _tmp0_;
_tmp1_ = main_foo;
main_bar (_tmp1_);
result = 0;
return result;
}