2012-09-06 2 views
1

저는 C++을 사용하여 GTK + 및 glade를 사용하여 프로그램을 만듭니다. 나는 glade가 만드는 객체의 메모리 관리에 대해 우려하고 있습니다. 예를 들어, 창, 버튼 및 두 개의 입력 필드로 구성된 glade 파일을 만듭니다. 다음 내 C++ 코드에서 해당 파일에서 개체를 만들고 해당 창에 대한 포인터를 가져옵니다. 내 질문은, 내가 안전하게 할 때 창 개체를 할당 해제해야합니까? 그렇지 않다면 왜 그럴 필요가 없습니까? 아래 코드는 내 코드 예제입니다 ...Glade 및 gtkmm을 사용하여 GTK + 객체의 메모리 관리

#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

GTK+ reference manual :

GtkBuilder 그것이 을 구축 한 모든 객체에 대한 참조를 보유하고 완료되면이 참조를 삭제합니다. 이렇게 마무리하면 은 최상위 창에 포함 된 이 아닌 위젯이 아닌 객체 또는 위젯을 파괴 할 수 있습니다. 빌더로 구성된 최상위 창에 대해서는 사용자가 gtk_widget_destroy()를 호출하여 이들을 제거하고 이들이 제거하는 모든 위젯 ( )을 호출해야합니다.

gtk_builder_get_object는 함수() 및 gtk_builder_get_objects()는 는 UI 설명 안에 자신에게 할당 된 이름 하여 위젯 인터페이스에 액세스하기 위해 사용될 수있다. 이 함수들에 의해 이 리턴 된 계단 창은 사용자가 gtk_widget_destroy()를 사용하여 명시 적으로 을 파기 할 때까지 머무를 것입니다. 다른 위젯은 빌더가 만든 큰 계층 구조의 일부이거나 ( 의 라이프 사이클에 대해 걱정할 필요가 없음) 또는 부모가없는 경우 어떤 컨테이너에 추가해야하는지 을 사용하십시오. 을 빌더의 수명 이상으로 유지하려면 g_object_ref()로 비 위젯 객체를 reffed해야합니다.

질문에 대답하십시오 : 네, 당신이 수동으로 당신이 그것을 완료하면 수동으로 파괴해야합니다.

1

GTK 위젯은 참조 카운트입니다. 창을 닫거나 소멸하면 마지막 참조가 해제되고 할당이 취소됩니다. (나는 생각하지만 빌더는 또한 레퍼런스를 보유 -하지만 빌더가 파괴 될 때 해제해야합니다.)에서