这是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调用相同,为什么第二个版本有效呢?
答案 0 :(得分:1)
请注意以下这一行:
sti = NULL;
sti
设置为NULL
(而_tmp1_
则传递给change_state
),因此现在对unref的调用是noop:
_g_object_unref0 (sti);