关于GTK移除部件时内存管理的疑问
关于GTK移除部件时内存管理的疑问
嘿,这个问题问到点子上了——GTK的引用计数尤其是浮动引用这块确实容易搞混,我给你理得明明白白的:
先顺着你的代码场景再捋一遍基础逻辑,你一开始的理解完全没问题:
/* Create a label widget with a floating reference. */ GtkWidget *lbl_text = gtk_label_new ("Text"); /* Create a grid container widget. */ GtkWidget *grid_text = gtk_grid_new (); /* Add the label to the grid, which replaces the floating reference with a standard reference. */ gtk_grid_attach ( GTK_GRID(grid_text), lbl_text, 0, 0, 3, 1);
当你销毁grid_text时,容器会自动释放它持有的标签引用,标签的引用计数归0,内存正常释放,流程完美。
现在回到你核心的问题:调用gtk_grid_remove()之后,标签的引用计数会变成啥样?
gtk_grid_remove (GTK_GRID(grid_text), lbl_text);
答案是:标签的引用计数会回到1,但这个是浮动引用(floating reference),不是普通的持有引用。它不会立刻被销毁,这时候你得手动处理它的生命周期:
- 如果你打算把这个标签再加到另一个容器里,那新容器会自动接手这个浮动引用,把它转换成自己的持有引用,这时候你啥都不用额外做
- 如果你不需要这个标签了,就必须手动调用
g_object_unref(lbl_text),把这个浮动引用释放掉,让引用计数归0,触发标签的销毁 - 要是啥都不做,这个标签就会变成内存泄漏,因为没有任何对象持有它的引用,它就一直占着内存没人管
简单说就是:移除操作只是让容器放弃了对标签的持有,把引用还给了浮动状态,你要么给它找下一个“归宿”(另一个容器),要么亲手“送走”它(调用unref)。
备注:内容来源于stack exchange,提问作者9-Pin
相关产品推荐
相关产品推荐

