Управление памятью объектов GTK + с использованием Glade и gtkmm

Я использую C ++ для создания программы с использованием GTK + и Glade. Я обеспокоен управлением памятью объектов, которые создает поляна. Например, я создаю файл glade, состоящий из окна, кнопки и двух полей ввода. Затем в своем коде C ++ я создаю объект из этого файла и получаю указатель на это окно. У меня вопрос, нужно ли мне безопасно освобождать объект окна, когда я закончу? Если нет, то почему я не должен? Ниже приведен пример моего кода …

#include <gtkmm.h>
#include "MattWindow.h"
#include <iostream>

using namespace std;

void buttonpush();

int main(int argc, char* argv[])
{
//This line initializes the GTK+ system
Gtk::Main kit(argc,argv);

//Declare a pointer to a window
Gtk::Window* window = 0;

try
{
//Load the glade file
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("layout.glade");

Assign window to point to the window object
builder->get_widget("window1",window);
window->show();
}
catch(Gtk::BuilderError& e)
{
cout<<e.what();
}

//Start everything up
Gtk::Main::run();//Who destroys the object that window is currently pointing to?

return 0;
}

void buttonpush()
{

}

1

Решение

От ГТК + справочное руководство:

GtkBuilder содержит ссылку на все объекты, которые он построил
и отбрасывает эти ссылки, когда он будет завершен. Эта доработка может
вызвать уничтожение не-виджетов объектов или виджетов, которые не являются
содержится в окне верхнего уровня. Для окон верхнего уровня, построенных
строитель, это ответственность пользователя, чтобы позвонить
gtk_widget_destroy (), чтобы избавиться от них и всех виджетов, которые они
содержат.

Функции gtk_builder_get_object () и gtk_builder_get_objects ()
может использоваться для доступа к виджетам в интерфейсе по именам
присваивается им внутри описания интерфейса. Вернулись вершины окна
с помощью этих функций будет оставаться до тех пор, пока пользователь явно не уничтожает
их с помощью gtk_widget_destroy (). Другие виджеты будут либо частью
большая иерархия построена строителем (в этом случае вы должны
не нужно беспокоиться об их жизненном цикле) или без родителя, в
в этом случае они должны быть добавлены в некоторый контейнер, чтобы использовать
их. Объекты не виджета должны быть помечены g_object_ref () для сохранения
их за пределами жизни строителя.

Чтобы ответить на ваш вопрос: да, вы должны вручную уничтожить окно, когда вы закончите с ним.

1

Другие решения

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

1

По вопросам рекламы [email protected]