内存管理——为什么这个函数返回一个(拥有的)值



代码

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超出作用域时,它将被销毁。为什么使用这个函数

return (owned) .str

返回a.str

返回(owned) .str

return a.str将使用g_strdup复制字符串,因为默认情况下,函数result和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:这在Vala教程的所有权部分和Genie教程的相应部分中都有记录。

我还要推荐参考处理文章

相关内容

  • 没有找到相关文章

最新更新