免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: C.J
打印 上一主题 下一主题

GTK不用释放的? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-11-25 16:33 |只看该作者

回复 #9 Sam1860 的帖子

_new出来的东西,绝对不能g_free。

一般来说,_new对应的是_destroy。
g_free,是处理你g_malloc出来的动态内存的。

论坛徽章:
0
12 [报告]
发表于 2008-11-25 17:58 |只看该作者
原帖由 naihe2010 于 2008-11-25 16:33 发表
_new出来的东西,绝对不能g_free。

一般来说,_new对应的是_destroy。
g_free,是处理你g_malloc出来的动态内存的。



建议你先查查文档,看看有多少个_new是有对应_destroy

论坛徽章:
0
13 [报告]
发表于 2008-11-26 10:16 |只看该作者

回复 #12 Sam1860 的帖子

_destroy,是对应你_new返回的结构的。当然不对称!

论坛徽章:
0
14 [报告]
发表于 2008-11-26 11:26 |只看该作者
原帖由 naihe2010 于 2008-11-26 10:16 发表
_destroy,是对应你_new返回的结构的。当然不对称!


你在自打嘴巴吗?如果不对称,没有destroy方法的类都不能释放内存了?

比如gtk_button_new ()一个button,在“绝对不能用g_free()"的情况下,请问一下应该怎样释放这个button对象呢?

论坛徽章:
0
15 [报告]
发表于 2008-11-26 11:30 |只看该作者
destroy方法只是某些特定对象才用的释放方法,如GNode, GTree这些有父子关系的组件,_destroy方法是个方便的方法,可以把子元素一并释放
某些组件也提供了gtk_XXXX_free()方法,但都是只有小数组件才有
g_free()才是通用的释放方法

论坛徽章:
0
16 [报告]
发表于 2008-11-26 21:11 |只看该作者
对于 gtk 控件, 不需要你手动 free
关闭窗口时 窗口会 自己free 掉, 并自动 free 属于它的控件
控件不需要你 free, 你不使用时  g_object_unref 掉, 系统会在合适的时候free

论坛徽章:
0
17 [报告]
发表于 2008-11-26 21:58 |只看该作者
对于GtkWidget 用 gtk_widget_destroy 释放

论坛徽章:
0
18 [报告]
发表于 2008-11-27 09:39 |只看该作者

回复 #14 Sam1860 的帖子

哈哈,所以你没明白什么叫做_destroy它的_new的结构。

你看看gtk_button_new的返回值是什么?
是widget,当然你想销掉它就用gtk_widget_destroy啊。

论坛徽章:
0
19 [报告]
发表于 2008-11-27 09:49 |只看该作者

回复 #15 Sam1860 的帖子

你敢不敢编译一下这个程序,然后分别定义与非定义那个宏,然后跑一下看看,告诉我你是怎么让它崩溃的吗?


  1. #include <gtk/gtk.h>

  2. //#define FUCK_G_FREE

  3. int
  4. main (int argc, char *argv[])
  5. {
  6.   GtkWidget *window_main;
  7.   GtkWidget *button_exit;
  8.   gtk_init (&argc, &argv);
  9.   window_main = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  10.   button_exit = gtk_button_new_with_label ("Exit");

  11.   gtk_container_add (GTK_CONTAINER (window_main), button_exit);

  12.   gtk_widget_show_all (window_main);

  13. #ifdef FUCK_G_FREE
  14.   g_free (button_exit);
  15. #else
  16.   gtk_widget_destroy (button_exit);
  17. #endif

  18.   gtk_main ();

  19.   return 0;
  20. }
复制代码

论坛徽章:
0
20 [报告]
发表于 2008-11-27 09:52 |只看该作者

再补充一下g_free的官方文档!

g_free ()

void                g_free                              (gpointer mem);

Frees the memory pointed to by mem. If mem is NULL it simply returns.
mem :         the memory to free

请相关人好好看看这个连接,读一读。
http://library.gnome.org/devel/g ... ory-Allocation.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP