今天写iTalk,想要把空组删除掉。
 //tree_store就是列表中的数据(TreeStore)
 //下面代码作用是扫描列表中的组,发现空组则删除。
     Gtk::TreeModel::Children children = tree_store->children();
     Gtk::TreeModel::iterator it_g;
      it_g = children.begin();
 
     for (; it_g != children.end(); ++it_g) {
         Gtk::TreeModel::Children grandson = it_g->children();
         if(grandson.begin()==grandson.end())
         {
             const Glib::ustring& tmp= (*it_g)[buddyColumns.id];
             std::cout<<tmp<<”为空组=======================”<<std::endl;
             tree_store->erase(it_g);
         }
     }
 
 不过遇到了段错误。思前想后发现段错误的原因是因为那个删除 tree_store->erase(it_g);
 执行了这句后,it_g所指向的数据已经失效,所以it_g++的话就会溢出。
 把for 循环改成do while循环,用一个中间变量来得到it_g的值,并用它来删除。
 
     do{
         Gtk::TreeModel::Children grandson = it_g->children();
         Gtk::TreeModel::iterator point = it_g;
         it_g++;
         if(grandson.begin()==grandson.end())
         {
             //const Glib::ustring& tmp= (*point)[buddyColumns.id];
             //std::cout<<tmp<<”为空组=======================”<<std::endl;
             tree_store->erase(point);
         }
 
     }
     while(it_g!=children.end());
 嗯。这样也算是解决问题吧。