【问题标题】:How to release the memory? [closed]如何释放内存? [关闭]
【发布时间】: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


【解决方案1】:

您已经将 gtk_main_quit 连接到窗口。当窗口被销毁时,她的所有子小部件也被销毁。

【讨论】:

  • 在我的例子中,当窗口被销毁时,窗口处理她的内存连同固定和按钮变量占用的内存一起被释放?
  • 我知道,如果一个小部件被销毁,并不意味着该小部件的内存被释放。
  • main 函数的第一行是声明三个指向 GtkWidget 类型的指针。之后你使用window = gtk_window_new。我很确定这个函数会返回分配 GtkWidget 的内存地址。如果您已经知道如何操作指针,则类似于:*window = &amp;your_widget。函数gtk_widget_destroy 应该类似于C 中的free(*pointer) 函数,因为这是释放内存的选择。请注意free(*pointer) 函数和gtk_widget_destroy(*pointer) 函数具有相同的语法。
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2010-10-14
  • 2013-07-18
  • 2020-01-04
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多