Vala函数调用中使用的拥有属性创建了"黑魔法C代码"

时间:2017-09-04 15:28:26

标签: pointers vala

这是Vala代码中的一个示例。

有一个存储一些指针的全局Glib.Llist vstack

List<void*> vstack;

change_state 功能将第二个参数存储在全局 vstack 列表中。

void change_state( enum..., void*, enum... );

这个 goto_info 测试函数(调用 change_state )不起作用,因为当它返回时,即使指针存储在列表中,指针也会被解除分配

// Vala source
void goto_info()
{
    StInfo sti = new StInfo();
    change_state( SUPS.INFO_PAGE, sti, StackDir.FORW );
}

// C output
void goto_info (void) {
    StInfo* sti = NULL;
    StInfo* _tmp0_ = NULL;
    _tmp0_ = st_info_new ();
    sti = _tmp0_;
    change_state (SUPS_INFO_PAGE, sti, STACK_DIR_FORW);
    _g_object_unref0 (sti);
}

但是,如果我只是添加拥有的属性,代码就可以工作(指针不会在 goto_info 函数的末尾解除分配),但我真的可以&#39 ;了解C输出的变化。

// Vala source
void goto_info()
{
    StInfo sti = new StInfo();
    change_state( SUPS.INFO_PAGE, ( owned )sti, StackDir.FORW );
}

// C output
void goto_info (void) {
    StInfo* sti = NULL;
    StInfo* _tmp0_ = NULL;
    StInfo* _tmp1_ = NULL;
    _tmp0_ = st_info_new ();
    sti = _tmp0_;
    _tmp1_ = sti;
    sti = NULL;
    change_state (SUPS_INFO_PAGE, _tmp1_, STACK_DIR_FORW);
    _g_object_unref0 (sti);
}

重要提示:如果添加拥有,goto_info是唯一可以更改的功能,Vala编译器不会触及任何其他功能。有人可以解释这个C输出代码中隐藏的黑魔法在哪里?如果对指针的ref / unref调用相同,为什么第二个版本有效呢?

1 个答案:

答案 0 :(得分:1)

请注意以下这一行:

sti = NULL;

sti设置为NULL(而_tmp1_则传递给change_state),因此现在对unref的调用是noop:

_g_object_unref0 (sti);