vala精灵释放记忆

Asy*_*abs 1 gnome glib vala genie

我的理解是Vala和Genie有引用计数而不是垃圾收集.

Per Valadoc.org,这个:

string path = Path.build_filename ("my", "full", "path/to.txt");
Run Code Online (Sandbox Code Playgroud)

得出这个:

a newly-allocated string that must be freed with g_free
Run Code Online (Sandbox Code Playgroud)

这是正确的还是g_free由于引用计数而不是必需的?

如果string是在对象内包裹将g_freestring上物件破坏付诸行动?

Jen*_*off 6

Valadoc包含原始GLib,GObject,Gtk +等库的文档.它还包含其他Vala特定文档.

您经常会看到只在C编程语言环境中有意义的句子.

Vala编译器为您执行内存管理(大多数情况下).在这个例子中,Vala string实际上是由Vala编译器转换为gchar *C语言,在那里它必须被释放g_free,Vala编译器也会使用它来为你做.

事实上,字符串与对象有点不同,因为它们不是引用计数,而是复制.

以Vala为例:

int main () {
  Object obj1 = new Object ();
  Object obj2 = obj1;

  string s1 = "";
  string s2 = s1;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

valac在C中生成的(手动清理的)代码如下所示:

int main (void) {
    GObject* obj1 = g_object_new (G_TYPE_OBJECT, NULL);
    GObject* obj2 = g_object_ref (obj1);
    gchar* s1 = g_strdup ("");
    gchar* s2 = g_strdup (s1);
    g_free (s2);
    g_free (s1);
    g_object_unref (obj2);
    g_object_unref (obj1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样obj2是对同一对象的引用,obj1并且仅在unref编辑两个引用时销毁对象.

字符串s2在另一侧上是存储在字符串的副本s1(其又字符串常量的副本"").

您还可以看到编译器会为您处理此类详细信息.它使手动引用计数和手动字符串复制自动化.

  • 只有指针需要手动销毁.当所有拥有的引用超出范围时,将自动删除该对象.还有一些特殊对象,以支持非GObject类(紧凑类).我建议你阅读这篇关于参考处理的文章:https://wiki.gnome.org/Projects/Vala/ReferenceHandling (2认同)