GTK+ 如何处理指针?
Posted
技术标签:
【中文标题】GTK+ 如何处理指针?【英文标题】:How does GTK+ deal with pointers? 【发布时间】:2017-02-10 21:59:43 【问题描述】:所以我正在用 C++ 编写一个 GTK+ 的应用程序(我可能应该使用 GTKmm,但我没有)并且使用 GTK+ 所有小部件等等都是指针,这不是很理想,但它不会编程真的更难了。但是,当窗口关闭时,这些指针会发生什么? GTK+ 是否拉取 Java 并垃圾收集所有指向 gpointers 的指针?如果没有,我如何访问 GTK+ 用来关闭窗口的方法和程序自己删除指针?
【问题讨论】:
【参考方案1】:如果您查看文档,您会发现 Gtk 指针都是从 gobjects 派生的。请参阅 g_object_ref
和 g_object_unref
上的文档,但基本上,它们会计算持有的副本数量。如果g_object_unref
导致使用计数为零,则该对象将被自动删除。
创建窗口会返回一个对象。告诉它关闭将删除显示的位,但调用g_object_unref
将删除它和所有嵌入的对象。当然,除非它有另一个副本,在这种情况下,它将一直存在,直到再次调用 uref()
。
【讨论】:
那么关闭窗口后是否需要调用g_object_unref? 销毁小部件可以释放它。 不是这样。例如,如果小部件是从资源加载的对话框,则资源会在下次请求时保留它的副本。关闭对话框会破坏窗口,但不会破坏对象。如有疑问,请尝试。如果您尝试释放它太多次,它将引发错误(尽管可能直到程序退出)。【参考方案2】:请阅读第 1.4 点(“GTK+ 中的内存管理如何工作?我应该释放从函数返回的数据吗?”)和 1.5(“如果我在创建小部件后立即销毁它,为什么我的程序会泄漏内存?”) GTK+ 3 common questions.
GTK 使用引用计数器来了解何时需要销毁 GObject 派生对象(如所有小部件)。例如,通过这种方式,销毁***窗口会销毁它包含的所有小部件。
【讨论】:
以上是关于GTK+ 如何处理指针?的主要内容,如果未能解决你的问题,请参考以下文章