【问题标题】:Free object/widget in GTK?GTK 中的免费对象/小部件?
【发布时间】:2011-02-21 04:40:04
【问题描述】:

我的 GTK 应用程序中有一个包装盒,我每隔一段时间就会用一个全新的条目替换它(至少现在因为我很着急)。

由于我用新实例替换它,我是否需要从内存中显式释放旧的包装盒内容,或者在 GTK 中是否有一些垃圾收集?

如果我确实需要明确需要释放对象,是否有一个命令会递归地转到该树中的所有对象(比如它会清除我在主包装盒内的盒子容器中的按钮)?另外,连接到对象的信号和处理程序呢?

我正在使用 C/GTK-2.0(gcc v4.4.3 和 GTK 2.20.0)。

【问题讨论】:

    标签: c gtk


    【解决方案1】:

    GObjects 是引用计数的。当您将小部件打包到容器中时,容器将接管所有权。

    当您执行gtk_container_remove() 时,容器持有的引用将被丢弃,这通常会导致小部件被销毁。

    所以不,您不需要显式销毁它,只需将其从容器中移除就足够了。

    gtk_container_remove() API 的 documentation 还表示,直接在孩子上调用 gtk_widget_destroy() 会更有效,所以如果你已经这样做了,那就没问题了。

    【讨论】:

    • 另外,当你销毁一个容器小部件时,它会释放它对包含在其中的所有小部件的引用,这通常也会导致它们被销毁,所以是的,它是递归的。