Gtkmm:将RefPtr与小部件一起保存在std :: vector中

时间:2014-03-13 08:55:56

标签: c++ c++11 vector gtk gtkmm

我正在尝试保留std::vector Gtk::Widget我正在展示(并且可能会)在Gtk::Container之间移动的Gtk::Notebook

目前我保留std::vector这基本上是Glib::RefPtr的一对一地图,但如果我在小部件周围使用std::vector<Glib::RefPtr<Gtk::Widget>> widgets;,我会在删除时遇到问题笔记本中的小部件。当我将它添加到笔记本中时,我已经必须使用'hack'来获取指向底层Gtk对象的指针,并且我怀疑当我从容器中移除它时,Notebook容器会释放/删除该对象。

我已经定义了这样的小部件向量: Glib::RefPtr<Gtk::Widget> w (new Gtk::Widget()); widgets.push_back (w); Gtk::Widget *wptr = w.operator->(); // hack notebook.append_page (*wptr);

当我向矢量和笔记本添加小部件时:

int c = 1; // widget no. to remove
notebook.remove_page (c);
auto it = widgets.begin() + c;
widgets.erase (it);

当我尝试删除它时:

G_IS_OBJECT

但是这会导致std::vector失败断言(我认为)iterator中的元素在notebook.remove_page()(函数结束)结束时被清除,因为可能RefPtr已经释放了该对象。我怎样才能做到这一点?是{{1}}的可能吗?

相关(相同的断言失败):Destructing Glib::RefPtr causes failed assertions in the GTK 3 core

2 个答案:

答案 0 :(得分:3)

油嘴:: RefPtr&LT;&GT;不应该与小部件一起使用。它不是通用的智能指针。它应该只用于强制你使用它的类 - 没有公共构造函数但是有公共的create *()方法。

答案 1 :(得分:1)

不幸的是,你不能这样做,因为Gtk::Notebook取得了子对象的所有权。您必须重构代码才能使用Gtk::Notebook本身来访问小部件而不是vector,例如使用Gtk::Notebook::get_nth_page()