c-GTK奇怪的内存泄漏



我用水平框和2个按钮创建了一个简单的GTK程序,它会导致巨大的内存泄漏。

以下是代码:(您可以使用gcc-main.c `pkg config--cflags gtk+-3.0`pkg config--libs gtk+3.0`进行编译(

#include <gtk/gtk.h>
GtkWidget* playorPauseButton;
GtkWidget* stopButton;
int status = 0;
gboolean updateView(gpointer user_data)
{
GtkWidget* image;

if (status == 0)
image=gtk_image_new_from_icon_name ("media-playback-pause",GTK_ICON_SIZE_DND);
else 
image=gtk_image_new_from_icon_name ("media-playback-start",GTK_ICON_SIZE_DND);
gtk_button_set_image((GtkButton*)playorPauseButton,image);
return TRUE;
}
int main( int argc, char *argv[])
{
gtk_init(&argc, &argv);
GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

GtkWidget* hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,10);
playorPauseButton = gtk_button_new_from_icon_name("media-playback-start",GTK_ICON_SIZE_DND);
gtk_box_pack_start((GtkBox*)hbox,playorPauseButton,0,0,0);

stopButton = gtk_button_new_from_icon_name ("media-playback-stop",GTK_ICON_SIZE_DND);
gtk_widget_set_sensitive(stopButton, FALSE); 
gtk_box_pack_start((GtkBox*)hbox,stopButton,0,0,0);
gtk_container_add(GTK_CONTAINER(window), hbox);
gdk_threads_add_timeout (200, updateView, NULL);
gtk_widget_show_all (window);
gtk_main();
return 0;
}

我运行这个程序并用";echo 0$(awk'/Private/{print"+",$2}'/proc/PID/smaps(|bc"在Linux中,如何判断进程使用了多少内存?

这就是我得到的:(内存以kB为单位,每2秒刷新一次(

10296
10620
12328
12580
12820
13056
13292
13472
13776
13944
14176
14440
14644
14828
15012

我在2平台上测试了这个。一个是GTK 3.22.3和Weston,第二个是GTK3.24.2和Xorg。在第二种情况下,Xorg流程正在增长。

有趣的部分是,当我评论行"gtk_widget_set_sensitive(stopButton,FALSE("或";gtk_button\uset_image(播放器或暂停按钮,图像("存在0内存泄漏。我不知道发生了什么,如何将按钮灵敏度设置为FALSE会导致如此巨大的内存泄漏。请帮我理解这一点。

如果有人想知道我想做什么,我会尝试创建控制面板,允许启动和停止机器,我希望停止按钮只在机器运行时激活。

我不确定是什么导致了内存泄漏,但有一件事可以做,那就是只有当status发生变化时才更改按钮图标,而不是每隔五分之一秒轮询一次。

这对性能更好,并且您的UI会立即更新——.2秒可能看起来不多,但会很明显。

相关内容

  • 没有找到相关文章

最新更新