Gtkmmの人たちは以下と比較 Glib::RefPtrしていstd::auto_ptr<>ます:
Glib::RefPtrスマートポインタです。具体的には、参照カウントのスマートポインタです。std::auto_ptr<>あなたは、スマートポインターでもあるが、Glib::RefPtr<>はるかに単純で、より便利な、に精通しているかもしれません。
しかし、奇妙な理由で、私は自分の仕事を終わらせることができませんRefPtr。同じコードは。で問題ありませんauto_ptr。
次のコードでSmartPtrは、はこれら2つのスマートポインターのいずれかのプレースホルダーにすぎません。
#include <gtkmm.h>
#include <iostream>
#include <tr1/memory>
struct WindowHolder {
SmartPtr<Gtk::Window> ptr;
WindowHolder()
: ptr(new Gtk::Window)
{
ptr->signal_delete_event().connect(sigc::mem_fun(*this, &WindowHolder::reset));
ptr->show_all();
}
bool reset(GdkEventAny* event)
{
Gtk::Main::quit();
}
};
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
WindowHolder w;
kit.run();
}
コンパイルするとき、私は最初にとして定義SmartPtrしGlib::RefPtr、次にとして定義しますstd::auto_ptr。
$ g++ '-DSmartPtr=Glib::RefPtr' `pkg-config --cflags --libs gtkmm-3.0` main.cc && ./a.out
(main:22093): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed
$ g++ '-DSmartPtr=std::auto_ptr' `pkg-config --cflags --libs gtkmm-3.0` main.cc && ./a.out
$
問題はこれGLib-GObject-CRITICALです。私の実際のアプリケーションでは、これは1行だけでなく、多数の行です。2番目のバージョンでは、std::auto_ptrすべてがうまく破壊されます。
奇妙なことに、GTK2では問題ないコードです。
$ g++ '-DSmartPtr=Glib::RefPtr' `pkg-config --cflags --libs gtkmm-2.4` main.cc && ./a.out
$
非推奨であるため、依存したくstd::auto_ptrありません。また、デストラクタがポインタを手動で削除する必要があるため、生のポインタを操作したくないため、複雑さが増します...
私の質問は次のとおりです。
- なぜ
Glib::RefPtrこの「重大な警告」(おそらくダブルフリー)が発生するのですか? - なぜgtkmm2.4では動作するのに3.0では動作しないのですか?
Glib::RefPtrとgtkmm3.0でコードを修正できますか?- このような状況を一般的にどのように処理する必要がありますか?