【发布时间】:2014-07-07 23:24:27
【问题描述】:
我有这个代码:
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window, *fixed, *button;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
gtk_widget_set_size_request(window, 400, 400);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(window), "Test");
gtk_widget_show(window);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed);
gtk_widget_show(fixed);
button = gtk_button_new_with_label("click");
gtk_fixed_put(GTK_FIXED(fixed), button, 30, 30);
gtk_widget_show(button);
gtk_main();
return 0;
}
我正在尝试释放内存,但失败了。也许有人修改此代码以便释放内存? 我阅读了有关 GTK 中的内存管理的信息,并且我大致了解它是如何工作的,但未能释放内存...
我了解这些函数是如何工作的要释放的内存。
谢谢!
【问题讨论】:
-
你打算释放哪块内存?这段代码没有什么特别需要你发布的。
-
如何判断内存没有被释放?你到底在解决什么问题?
-
我想释放window、fixed和button变量占用的内存。我得出结论,当我用 valgrind 运行代码时,内存没有释放。
-
像 GTK(以及底层的 GDK、Xlib、cairo、pango、FreeType 等)这样的大型库使用内存分析器分析起来很复杂,因为它们使用池分配器来重用释放的对象以供以后分配同类。这通常会导致像 valgrind 这样的工具报告错误的内存泄漏。更健壮的测试是原始测试:在具有大量迭代的循环中创建和销毁窗口,并注意进程的内存使用情况。如果它在整个测试过程中不断增长,则说明存在内存泄漏。如果它开始增长,但随后趋于平稳,一切都很好。
-
我执行了我工作的应用程序。最初应用程序占用 12mb。我打开更多窗口,应用程序占用 22mb。在我关闭所有窗口之后,应用程序占用了 16mb。为什么应用程序占用 4mb 以上?没关系还是我有内存泄漏?
标签: c memory-management memory-leaks gtk