vala精灵释放记忆

问题描述 投票:1回答:1

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

Per Valadoc.org,这个:

string path = Path.build_filename ("my", "full", "path/to.txt");

得出这个:

a newly-allocated string that must be freed with g_free

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

如果string被包裹在一个物体内,g_free上的string会对物体破坏采取行动吗?

glib gnome vala genie
1个回答
6
投票

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

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

Vala编译器为您执行内存管理(大多数情况下)。在这个例子中,Vala string实际上是由Vala编译器翻译成C中的gchar *,它必须使用g_free解除分配,Vala编译器也为你做了。

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

以Vala为例:

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

  string s1 = "";
  string s2 = s1;
  return 0;
}

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;
}

正如你所看到的,obj2是对obj1中相同对象的引用,只有当两个引用都是unrefed时才会销毁对象。

另一边的字符串s2是存储在s1中的字符串的副本(这是字符串文字""的副本)。

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

© www.soinside.com 2019 - 2024. All rights reserved.