C 如何释放内存?

C 如何释放内存?,c,memory-management,memory-leaks,gtk,C,Memory Management,Memory Leaks,Gtk,我有以下代码: #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), FA

我有以下代码:

#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;
}
#包括
int main(int argc,char*argv[])
{
GtkWidget*窗口,*固定,*按钮;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置可调整大小(gtk_窗口(窗口),错误);
gtk_widget_set_size_请求(窗口,400400);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_窗口设置标题(gtk_窗口(窗口),“测试”);
gtk_widget_show(窗口);
g_信号连接(g_对象(窗口),“销毁”,
G_回调(gtk_main_quit),NULL);
固定=gtk_固定_新();
gtk_容器添加(gtk_容器(窗口),固定);
gtk_widget_show(固定);
按钮=gtk_按钮_新建_,带_标签(“点击”);
gtk_固定放置(gtk_固定(固定),按钮,30,30);
gtk_小部件_显示(按钮);
gtk_main();
返回0;
}
我试图释放内存,但失败了。也许有人修改这段代码,以便释放内存? 我读过GTK中的内存管理,我基本上了解它是如何工作的,但没有释放内存

我了解这些函数是如何工作的gtk_widget_destroy()、g_object_ref_seek()、g_object_ref()和g_object_unref(),我不想在这些函数或文档中收到引用,我希望修改这些代码,以便释放内存


谢谢!

您已经将gtk\u main\u quit连接到窗口。当窗口被破坏时,她的所有子窗口小部件也被破坏

你打算释放哪个内存?这段代码中没有什么特别需要释放的东西。你如何断定内存没有释放?你到底在解决什么问题?我想释放窗口、固定和按钮变量占用的内存。我的结论是,当我使用valgrind运行代码时,内存没有释放。GTK(以及底层的GDK、Xlib、cairo、pango、FreeType等)等大型库使用内存探查器进行分析非常复杂,因为它们使用池分配器,将释放的对象重新用于以后的同类分配。这通常会导致valgrind等工具报告错误的内存泄漏。一个更健壮的测试是一个原始测试:在循环中创建和销毁一个包含大量迭代的窗口,并注意进程的内存使用情况。如果它在整个测试过程中不断增长,则表示内存泄漏。如果它开始增长,但随后趋于平稳,那么一切都很好。我执行了我工作的应用程序。最初,应用程序占用12mb。我打开了更多的窗口,应用程序占用了22mb。在我关闭所有窗口之后,应用程序占用了16mb。为什么应用程序占用4mb以上的空间?没关系,还是我有内存泄漏?在我的示例中,当窗口被破坏时,窗口处理她的内存与fixed和button变量占用的内存一起释放?我知道,如果小部件被破坏,这并不意味着小部件的内存被释放。主函数的第一行是声明三个指向GtkWidget类型的指针。然后使用
window=gtk\u window\u new
。我很确定这个函数返回了分配GtkWidget的内存地址。如果您已经知道如何操作指针,这是这样的:
*window=&your_小部件
。函数
gtk\u widget\u destroy
应该类似于C中的
free(*pointer)
函数,因为这是释放内存的选择。请注意,
free(*pointer)
函数和
gtk_widget_destroy(*pointer)
函数具有相同的语法。