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でコードを修正できますか?- このような状況を一般的にどのように処理する必要がありますか?