Gtk::manageによるdeleteの自動化
概要
Gtk::manageによるwidgetのdeleteの自動化について説明する。widgetをnewで作成したときは通常のポインタと同様にdeleteでメモリを明示的に解放する必要が あるが、Gtk::manageによってdelete処理を自動化し、delete忘れによるメモリリークの危険を無くすことが出来る。 具体的にはnewしたwidgetをGtk::manageを使って親コンテナの管理下に置くことによって、 親コンテナが解放されたときに管理下にある子widgetも同時に削除されるようになる。 したがって特に理由が無い限りはwidgetをnewする際はGtk::manageを使用しておくのが安全である。
ソース
manage.cpp#include <gtkmm.h> #include <iostream> class MyButton : public Gtk::Button { public: virtual ~MyButton(){ std::cout << "~MyButton\n"; } }; class MainWin : public Gtk::Window { MyButton* m_button; public: MainWin(){ m_button = Gtk::manage( new MyButton() ); m_button->add_label( "manage" ); add( *m_button ); show_all_children(); } virtual ~MainWin(){ std::cout << "~MainWin\n"; } }; int main( int argc, char *argv[] ) { Gtk::Main kit( argc, argv ); MainWin mainwin; Gtk::Main::run( mainwin ); return 0; }
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ manage.cpp -o manage `pkg-config gtkmm-2.4 --cflags --libs`
結果
上を実行してウィンドウを閉じた場合、$ ./manage ~MainWin ~MyButton子widgetが削除されていることが分かる。一方 new の部分を
m_button = new MyButton();と変更して実行すると
$ ./manage ~MainWinとなり子widgetが削除されていないことが分かる。