2017-09-04 55 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

相關問題