Memory management Gtk2、Gdk2内存使用量在每帧更新时都会越来越大

Memory management Gtk2、Gdk2内存使用量在每帧更新时都会越来越大,memory-management,gtk2,gdkpixbuf,Memory Management,Gtk2,Gdkpixbuf,我一直在尝试制作一个程序,该程序使用活动窗口,并在其窗口中显示它。 我成功地超过了我的目标。但问题是,它使用了大量的ram,而且每次帧更新20fps都会使用更多的内存。 以下是源代码: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <string.h> #include <gdk/gdkx.h> #inc

我一直在尝试制作一个程序,该程序使用活动窗口,并在其窗口中显示它。 我成功地超过了我的目标。但问题是,它使用了大量的ram,而且每次帧更新20fps都会使用更多的内存。 以下是源代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>

int funcfinished = 1;

GtkWidget *window;

GdkPixbuf *fupdate_pixbuf;
GtkStyle *fupdate_style;
GdkPixmap *fupdate_background;
gint fupdate_xorig;
gint fupdate_yorig;
gint fupdate_width;
gint fupdate_height;
GdkPixbuf *fupdate_screenshot;
GdkWindow *fupdate_window;

gboolean frameupdate()
{
    if(funcfinished == 1)
    {
        /*********[FuncFinish]*********/
        funcfinished = 0;
        fupdate_pixbuf = NULL;
        fupdate_style = NULL;
        fupdate_background = NULL;
        fupdate_screenshot = NULL;
        fupdate_window = NULL;
        fupdate_xorig = 0;
        fupdate_yorig = 0;
        fupdate_width = 0;
        fupdate_height = 0;

        /*********[Func]*********/
        fupdate_window = gdk_screen_get_active_window(gdk_screen_get_default());

        gdk_drawable_get_size(fupdate_window, &fupdate_width, &fupdate_height);

        fupdate_pixbuf = gdk_pixbuf_get_from_drawable(NULL, fupdate_window, NULL, 0, 0, 0, 0, fupdate_width, fupdate_height);

        gdk_pixbuf_render_pixmap_and_mask(fupdate_pixbuf, &fupdate_background, NULL, 0);
        fupdate_style = gtk_style_new();
        fupdate_style->bg_pixmap[0] = fupdate_background;
        gtk_widget_set_style(GTK_WIDGET(window), GTK_STYLE(fupdate_style));

        /*********[FuncFinish]*********/
        fupdate_pixbuf = NULL;
        fupdate_style = NULL;
        fupdate_background = NULL;
        fupdate_screenshot = NULL;
        fupdate_window = NULL;
        fupdate_xorig = 0;
        fupdate_yorig = 0;
        fupdate_width = 0;
        fupdate_height = 0;
        funcfinished = 1;
    }
    else
    {
        printf("Skipped 1 frame update");
    }
    return TRUE;
}

int main(int argc, char *argv[])
{
    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Hay Day Autobot");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);


    g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    g_timeout_add(50, frameupdate, 0);

    gtk_widget_show(window);

    gtk_main();
    return 0;
}
我还制作了一个视频,展示了这个问题:

您没有释放在帧更新功能期间创建的内存。对于您在那里使用的每个函数,您应该在文档中查找它,并查看它在返回值下的内容

例如,将其返回值列为“完全传输”。这意味着当您调用该函数时,返回值的全部所有权转移给您;所有权意味着您负责释放内存。通常文档也会说明如何做到这一点。在这种情况下,你可以阅读

当不再需要时,应使用g_object_unref取消返回返回的窗口

另一方面,是无转移,所以你不需要在那里做任何事情