瓦拉精灵释放记忆
vala genie freeing memory
我的理解是 Vala 和 Genie 有引用计数而不是垃圾收集。
根据 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
上对对象销毁采取行动吗?
Valadoc 包含来自原始 GLib、GObject、Gtk+ 等库的文档。除此之外,它还包含其他 Vala 特定文档。
你经常看到只有在 C 编程语言的上下文中才有意义的句子。
Vala 编译器为您进行内存管理(大部分时间)。在这个例子中,Vala string
实际上被 Vala 编译器翻译成 C 中的 gchar *
,在 C 中它必须使用 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
中相同对象的引用,只有当两个引用都被 unref
ed 时,该对象才会被销毁。
另一边的字符串 s2
是存储在 s1
中的字符串的副本(这又是字符串文字 ""
的副本)。
如您所见,编译器确实会为您处理这些细节。它使手动引用计数和手动字符串复制自动进行。
我的理解是 Vala 和 Genie 有引用计数而不是垃圾收集。
根据 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
上对对象销毁采取行动吗?
Valadoc 包含来自原始 GLib、GObject、Gtk+ 等库的文档。除此之外,它还包含其他 Vala 特定文档。
你经常看到只有在 C 编程语言的上下文中才有意义的句子。
Vala 编译器为您进行内存管理(大部分时间)。在这个例子中,Vala string
实际上被 Vala 编译器翻译成 C 中的 gchar *
,在 C 中它必须使用 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
中相同对象的引用,只有当两个引用都被 unref
ed 时,该对象才会被销毁。
另一边的字符串 s2
是存储在 s1
中的字符串的副本(这又是字符串文字 ""
的副本)。
如您所见,编译器确实会为您处理这些细节。它使手动引用计数和手动字符串复制自动进行。