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