来自 Gtkmm 的人正在比较 :Glib::RefPtr
std::auto_ptr<>
Glib::RefPtr
是一个智能指针。具体来说,它是一个引用计数智能指针。您可能熟悉std::auto_ptr<>
,它也是一个智能指针,但Glib::RefPtr<>
更简单,更有用。
但由于某些奇怪的原因,我无法使用RefPtr
. 相同的代码适用于auto_ptr
.
在下面的代码中,SmartPtr
只是这两个智能指针之一的占位符。
#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
。在我的实际应用程序中,这不仅仅是一行,而是一大堆。在第二个版本中,std::auto_ptr
一切都被破坏得很好。
奇怪的代码在 GTK 2 中就很好了:
$ g++ '-DSmartPtr=Glib::RefPtr' `pkg-config --cflags --libs gtkmm-2.4` main.cc && ./a.out
$
我不想依赖,std::auto_ptr
因为它已被弃用,我也不想使用原始指针,因为这样析构函数必须手动删除指针,这会增加额外的复杂性......
我的问题是:
- 为什么会导致
Glib::RefPtr
这个“严重警告”(可能是双重免费)? - 为什么它适用于 gtkmm 2.4 但不适用于 3.0?
- 我可以用
Glib::RefPtr
gtkmm 3.0 修复代码吗? - 我一般应该如何处理这种情况?