Pointers Vala函数调用中使用的Owned属性创建;黑魔法C代码“;

Pointers Vala函数调用中使用的Owned属性创建;黑魔法C代码“;,pointers,vala,Pointers,Vala,这是Vala代码中的一个示例 有一个全局Glib.Llistvstack存储一些指针 List<void*> vstack; 此goto_info测试函数(调用change_state)不起作用,因为当指针返回时,即使它存储在列表中,指针也会被释放 // Vala source void goto_info() { StInfo sti = new StInfo(); change_state( SUPS.INFO_PAGE, sti, StackDir.FORW

这是Vala代码中的一个示例

有一个全局Glib.Llistvstack存储一些指针

List<void*> vstack;
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);
}
但是如果我只添加owned属性,代码就可以工作了(指针不会在goto_info函数的末尾被释放),但是我真的无法理解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是唯一一个在我添加owned时会更改的函数,Vala编译器不会涉及其他任何功能。有人可以解释这个C输出代码中隐藏的黑魔法在哪里?如果指针的ref/unref调用相同,为什么第二个版本可以工作?

请注意这一行:

sti = NULL;
sti
被设置为
NULL
(而
\u tmp1\u
被传递到
change\u state
),因此现在对unref的调用是一个noop:

_g_object_unref0 (sti);

天才!答案很简单,但我真的没想到在自动生成的代码中会出现这样的noop。非常感谢您的快速支持!
_g_object_unref0 (sti);