代码调试集

来源:互联网 发布:软件初级工程师 编辑:程序博客网 时间:2024/06/06 16:30

###将工作中遇到的程序调试问题汇集于本篇,吸取教训,不在同一个地方跌倒

2016.7.12项目:拼音输入法资源打包工具

FSTGeneric CBuildEnglishDict::apply_apostrophe_rule(FSTGeneric &fst ){         // mapping part         for ( int state = 0; state < fst->get_states_count();state++)         {                   FSTArcVector arcs_need_add;                   for ( FSTArcIter i = fst->arcs_out(state,FSTInput); i.valid(); i++ )                   {                            if ( state != 0 && i->input ==FSTstring_map["'"] )                            {                                     arcs_need_add.push_back((FSTArc*)(*i));                            }                   }                   for(FSTArcIter it(arcs_need_add); it.valid();it++)                   {                            fst->add_arc(state, it->next,FSTstring_map[""], it->output, it->weight);                   }                                           }         /*for ( int state = 0; state <fst->get_states_count(); state++ )         {         for ( FSTArcIter i = fst->arcs_out(state, FSTInput);i.valid(); i++ )         {         if ( state != 0 && i->input ==FSTstring_map["'"] )        {         fst->add_arc(state, i->next,FSTstring_map[""], i->output, i->weight);         }         }         }*/         return fst;}


上述代码中的注释掉的为老代码,会导致程序崩溃。注释掉的代码中的内循环用于遍历某个状态下的所有弧。当某条弧满足条件后,执行添加弧操作。该操作会导致FSTArcVector重新分配内存空间,因而再通过原迭代器访问弧就会出现问题。

尽管vector会留有内存空间方便添加元素,但是不能确保在下次添加元素后内存空间不发生变化,即使添加元素后的size仍然小于capacity



0 0
原创粉丝点击