为什么这个函数返回(拥有)值?

时间:2015-07-13 14:57:30

标签: memory-management vala genie ownership-semantics

代码 来自:Genie howto repeat a string N times as an string array Genie howto repeat a string N times as an string array

def repeatwithsep (e: string, n: int, separator: string): string
    var elen = e.length;
    var slen = separator.length;
    var a = new StringBuilder.sized ((elen * n) + (slen * (n - 1)) + 1);
    for var i = 0 to (n - 1)
        if i != 0
            a.append_len (separator, slen)
        a.append_len (e, elen)
    return (owned) a.str

var a 是一个局部变量,当 a 超出范围时,它将被销毁。 为什么这个功能

返回(拥有)a.str

之间有什么区别

返回a.str

return(拥有)a.str

(拥有)

的好处是什么?

1 个答案:

答案 0 :(得分:5)

return a.str将使用g_strdup复制字符串,因为默认情况下,函数结果和StringBuilder在(隐式)赋值后都将拥有该字符串的单独副本。

由于存储在a中的StringBuilder将超出范围,因此它的副本将永远不会被再次使用,在这种情况下,这是不可取/有效的。

因此,解决方案是使用a.str指令将字符串的所有权从(owned)传递给函数的结果。

BTW:您可以通过使用valac -C编译这两个版本并比较生成的C代码来轻松找到它:

-       _tmp21_->str = NULL;
-       result = _tmp22_;
+       _tmp23_ = g_strdup (_tmp22_);
+       result = _tmp23_;

(在此比较中,左侧为return (owned) a.str,右侧为return a.str

PS:ownership section of the Vala tutorialcorresponding part of the Genie tutorial中记录了这一点。

我还推荐Reference Handling article