LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1163|回复: 5

GTK+中类似gtk_hbox_new这样的给构件分配内存的函数 为什么不用手动释放?

[复制链接]
发表于 2009-9-7 12:43:29 | 显示全部楼层 |阅读模式
返回肯定是堆指针 为什么不用释放?
是系统自动调用释放函数了吗
发表于 2009-9-7 13:39:29 | 显示全部楼层
gtk 中 widget 都是基于 gobject 的, 它们会持有一个引用计数, 降至 0 时自动被释放.

新创建的其计数为 1, 加入某个容器不会改变其计数, 而从容器 remove 时计数会减 1, 这样一般不加额外处理的情况下就会被释放.

一个 widget 被 destroy 时可认为它会将所有的 children 都先 remove 掉, 再释放自己, 这样 children 的情况可参考上面的说明

顶级窗口会持有对 gtk 的一个引用计数, 当顶级窗口关闭 (destroy) 时计数减 1. 当 gtk 的引用减至 0 时, 等效于 gtk_main_quit()

gtk_main_quit() 的情况我不太确定, 它应该是执行以下的一条路径 (所有的 gobject / 所有的 widget / 所有的顶级窗口) (发送 destroy 事件 / 引用计数减 1), 但是具体是哪一个我不清楚, 谁来明确一下? 不过印象中 gtk_main_quit() 后所有已创建的 widget 就失效了, 即使手动增加过它们的计数. 这样很有可能是所有已创建的 widget 都被 destroy 了.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-7 14:48:15 | 显示全部楼层
谢谢 了解了大概呵呵
testgtk.c这个文件谁有?
我看教程上写在tests/testgtk.c里
可是我没有那个啊
回复 支持 反对

使用道具 举报

发表于 2009-9-7 16:54:26 | 显示全部楼层
Post by remote fish;2024744


顶级窗口会持有对 gtk 的一个引用计数, 当顶级窗口关闭 (destroy) 时计数减 1. 当 gtk 的引用减至 0 时, 等效于 gtk_main_quit()


这句话有点问题,gtk_main_quit是一定要显示调用的,不然即使窗口都没有了,但是主循环还在跑,应用也活着,当然用g_main_loop_quit也是可以退出主循环的。
如果调用了gtk_main_quit的话,所有的widget就都被delete掉了。
回复 支持 反对

使用道具 举报

发表于 2009-9-8 12:18:50 | 显示全部楼层
realtang 兄指教的是. gtk 引用降至 0 并不会等效于 gtk_main_quit()
回复 支持 反对

使用道具 举报

发表于 2009-9-9 08:55:42 | 显示全部楼层
remote兄过谦了,互相学习而已。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表