在尝试使用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;
}