2017-09-04 54 views
0

这是Vala代码中的一个示例。用于Vala函数调用的拥有属性创建“黑魔法C代码”

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

List<void*> vstack; 

有存储的第二个参数,在全球vstack列表change_state功能。

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功能的末尾),但我真的不明白C o中的变化本安输出。

// 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是,如果我添加拥有,没有别的由瓦拉编译感动而改变的功能。有人可以解释隐藏在这个C输出代码中的黑魔法在哪里?为什么第二个版本在指针的ref/unref调用相同时工作?

回答

1

注意这一行:

sti = NULL; 

sti设置为NULL(而_tmp1_传递给change_state代替),所以现在要UNREF调用的是一个空操作:

_g_object_unref0 (sti); 
+0

天才!答案非常简单,但我真的不希望在自动生成的代码中这样做。非常感谢您的快速支持! – MMar

相关问题