Memory leaks while using GTK+ over DirectFB

 

先说如何发现这个问题的.其实之前一直在用,但发现自己的app老是跑着跑着就死机....还以为是自己的问题.然后一天同事说看看是或否是内存的原因.就在虚拟机上检查了一下,内存果然出问题了.首先发现的是GDK的PIXBUF,我们这里做了一个图片浏览器,因此,这里用了PIXBUF,然后加载了N次.而PIXBUF使用后必须释放一下,才能再次加载图片,否则它自己是不会释放已近加载的图片的内存的.所以这里发现了第一个内存泄露的地方.这个测试完了之后再虚拟机上就测不出来内存泄露的问题了.于是上了开发板上接着测,还是有问题.由于我们的程序过大,而且我不觉得是自己的程序出错了,就写了个比较简单的创建,销毁窗口的例子.如下:

#include<gtk/gtk.h>
void window_quit(GtkWidget *widget,gpointer data)
{
gtk_widget_destroy(GTK_WIDGET(data));
}
void button_press(GtkWidget *widget,gpointer data)
{
GtkWidget *window;
GtkWidget *fix;
GtkWidget *button;
GtkWidget *image;
GdkPixbuf *pixbuf;

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window),640,480);

fix = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window),fix);

button = gtk_button_new_with_label("quit");
gtk_widget_set_usize(button,190,90);
gtk_fixed_put(GTK_FIXED(fix),button,450,120);
g_signal_connect(button,"clicked",G_CALLBACK(window_quit),window);

gtk_widget_show_all(window);  
}

int main(int argc,char *argv[])
{
gtk_init(&argc,&argv);
GtkWidget *window;
GtkWidget *button;
GtkWidget *fix;

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window),640,480);

fix = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window),fix);

button = gtk_button_new_with_label("hello");
gtk_widget_set_usize(button,120,90);
gtk_fixed_put(GTK_FIXED(fix),button,20,200);
g_signal_connect(button,"clicked",G_CALLBACK(button_press),NULL);

button = gtk_button_new_with_label("quit");
gtk_widget_set_usize(button,120,90);
gtk_fixed_put(GTK_FIXED(fix),button,450,200);
g_signal_connect(button,"clicked",G_CALLBACK(gtk_main_quit),NULL);

gtk_widget_show_all(window);
gtk_main();
return FALSE;
}

然后发现,这样循环的创建/销毁/创建/销毁,会发生内存泄露.我的第一反应时库的版本不匹配,导致了GTK释放了空间,但是DFB未能释放.猜中了结果,但是猜错了原因.呵呵.这里非常感谢Harinandan S,在我从新编译了10多次不同版本的库之后,我终于放弃了,于是在GOOGLE上找到了和我类似的问题的解决方法:

http://www.mail-archive.com/directfb-users@directfb.org/msg07523.html

我是在Directfb的头文件directfb.h里面加上了一个头文件的定义:#include <directfb_version.h>.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值