Я использую 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()
{
}
От ГТК + справочное руководство:
GtkBuilder содержит ссылку на все объекты, которые он построил
и отбрасывает эти ссылки, когда он будет завершен. Эта доработка может
вызвать уничтожение не-виджетов объектов или виджетов, которые не являются
содержится в окне верхнего уровня. Для окон верхнего уровня, построенных
строитель, это ответственность пользователя, чтобы позвонить
gtk_widget_destroy (), чтобы избавиться от них и всех виджетов, которые они
содержат.Функции gtk_builder_get_object () и gtk_builder_get_objects ()
может использоваться для доступа к виджетам в интерфейсе по именам
присваивается им внутри описания интерфейса. Вернулись вершины окна
с помощью этих функций будет оставаться до тех пор, пока пользователь явно не уничтожает
их с помощью gtk_widget_destroy (). Другие виджеты будут либо частью
большая иерархия построена строителем (в этом случае вы должны
не нужно беспокоиться об их жизненном цикле) или без родителя, в
в этом случае они должны быть добавлены в некоторый контейнер, чтобы использовать
их. Объекты не виджета должны быть помечены g_object_ref () для сохранения
их за пределами жизни строителя.
Чтобы ответить на ваш вопрос: да, вы должны вручную уничтожить окно, когда вы закончите с ним.
GTK виджеты подсчитываются. Когда вы закрываете или уничтожаете свое окно, оно освобождает свою последнюю ссылку и освобождается. (Хотя я считаю, что у застройщика также есть ссылка, но она должна быть освобождена, когда застройщик уничтожен.)