1

私はC++を使用して、GTK+とgladeを使用してプログラムを作成しています。空き地が作成するオブジェクトのメモリ管理が心配です。たとえば、ウィンドウ、ボタン、および2つの入力フィールドで構成される空き地ファイルを作成します。次に、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()
{

}
4

2 に答える 2

1

GTKウィジェットは参照カウントされます。ウィンドウを閉じるか破棄すると、最後の参照が解放され、割り当てが解除されます。(ビルダーも参照を保持していると思いますが、ビルダーが破棄されたときに解放する必要があります。)

于 2012-09-06T20:04:32.743 に答える
1

GTK +リファレンスマニュアルから:

GtkBuilderは、構築したすべてのオブジェクトへの参照を保持し、ファイナライズされるとこれらの参照を削除します。このファイナライズにより、トップレベルウィンドウに含まれていない非ウィジェットオブジェクトまたはウィジェットが破棄される可能性があります。ビルダーによって構築されたトップレベルのウィンドウの場合、gtk_widget_destroy()を呼び出して、それらとそれらに含まれるすべてのウィジェットを取り除くのはユーザーの責任です。

関数gtk_builder_get_object()およびgtk_builder_get_objects()を使用して、UI記述内でウィジェットに割り当てられた名前でインターフェース内のウィジェットにアクセスできます。これらの関数によって返されるトップレベルのウィンドウは、ユーザーがgtk_widget_destroy()で明示的に破棄するまで残ります。他のウィジェットは、ビルダーによって構築されたより大きな階層の一部になるか(この場合、ライフサイクルについて心配する必要はありません)、親がない場合は、ウィジェットを使用するためにコンテナーに追加する必要があります。 。非ウィジェットオブジェクトは、ビルダーの寿命を超えて維持するために、g_object_ref()で参照する必要があります。

あなたの質問に答えるために:はい、あなたがそれを終えたら、あなたは手動でウィンドウを破壊するべきです。

于 2012-09-06T20:06:39.520 に答える