2010-05-19 4 views
3

У меня есть коробка с коробкой в ​​моем приложении GTK, и я заменяю ее раз в то время совершенно новой записью (по крайней мере, сейчас я нахожусь в спешке).Бесплатный объект/виджет в GTK?

Поскольку я заменяю его новым экземпляром, мне нужно явно освободить память от старого содержимого пакета или есть какая-то сборка мусора в GTK?

Если мне действительно нужно освободить объект, есть ли команда, которая будет рекурсивно переходить ко всем объектам в этом дереве (например, очистит мою кнопку в контейнере ящика внутри моего основного пакета)? Кроме того, как насчет сигналов и обработчиков, подключенных к объектам?

Я использую C/GTK-2.0 (gcc v4.4.3 и GTK 2.20.0).

ответ

5

GObjects подсчитываются по ссылке. Когда вы упаковываете виджет в контейнер, контейнер переходит в собственность.

Когда вы делаете gtk_container_remove(), ссылка, содержащаяся в контейнере, отбрасывается, что обычно приводит к уничтожению виджета.

Нет, вам не нужно явно его уничтожать, достаточно просто удалить его из контейнера.

documentation для gtk_container_remove() API также говорит, что это может быть более эффективным, чтобы просто позвонить gtk_widget_destroy() непосредственно на ребенка, так что если это то, что вы уже делаете все в порядке.

+0

Кроме того, когда вы уничтожаете виджет контейнера, он освобождает ссылки на все виджеты, упакованные внутри него, что обычно приводит к их уничтожению, поэтому да, это рекурсивный. – ptomato

Смежные вопросы