2

何が原因でしょうか?

スタックトレースは次のとおりです。

#0  0x0645c0f5 in std::_Rb_tree_increment (__x=0x83ee5b0)
    at ../../../../libstdc++-v3/src/tree.cc:69
#1  0x0805409a in std::_Rb_tree_iterator<std::pair<std::string const, Widget*> >::operator++ (
    this=0xbffff144)
    at /usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/bits/stl_tree.h:192
#2  0x08053d32 in Generic::StartLayout (this=0x8287d68) at Generic.cpp:195
#3  0x0804f6e1 in LCDControl::ConfigSetup (this=0xbffff26c) at LCDControl.cpp:91
#4  0x0804ed7c in LCDControl::Start (this=0xbffff26c, argc=1, argv=0xbffff404) at LCDControl.cpp:21
#5  0x08050964 in main (argc=1, argv=0xbffff404) at Main.cpp:11

そしてここにコードがあります:

    for(std::map<std::string,Widget *>::iterator w = widgets_.begin();
        w != widgets_.end(); w++){
        if( w->second->GetType() & WIDGET_TYPE_BAR) {
            w->second->SetupChars();
        }
        w->second->Start();

    }

編集:この次の問題は関連しているので、まったく新しい質問を開くことはしません。回答はそのままにしておきます。私はただ何かを知る必要があります。2つのイテレータがあります。1つはメインで、もう1つは関数呼び出し後のメイン内にあります。それらは両方とも同じマップに関連しています。さて、内部のものはすべて破損し、メインのもののループは反復を停止します。

これがコードです。

StartLayoutは次のとおりです。

void Generic::StartLayout() {
    Error("StartLayout: %s", key.c_str());
    for(std::map<std::string,Widget *>::iterator w = widgets_.begin();
        w != widgets_.end(); w++){
        Error("Starting widget %s", w->first.c_str());
        if( w->second->GetType() & WIDGET_TYPE_SPECIAL) {
            w->second->SetupChars();
        }

        w->second->Start();
    }
}

そしてここにSetupChars()があります:

void WidgetGif::SetupChars() {
    Error("SetupChars <%s> <%s>", name_.c_str(), widget_base_.c_str());
    Error("Size of widgets: %d", visitor_->Widgets().size());
    std::map<std::string, Widget *> widgets = visitor_->Widgets();
    for(std::map<std::string, Widget *>::iterator ii=visitor_->Widgets().begin();
        ii != visitor_->Widgets().end(); ii++) {
        Error("<%s> Widget base %s == %s", ii->first.c_str(), ii->second->GetWidgetBase().c_str(), widget_base_.c_str());
        if(ii->second->GetWidgetBase() == widget_base_ &&
            ((WidgetGif *)ii->second)->HasChars()) {
            Error("Using chars from %s", ii->first.c_str());
            for(unsigned int i = 0; i < rows_ * cols_; i++ ) {
                if(i >= visitor_->GetLCDText()->CHARS) {
                    Error("1) GIF too large: %s, %d", name_.c_str(), visitor_->GetLCDText()->CHARS);
                    if(update_) delete update_;
                    update_ = new Property(visitor_, section_, "", new Json::Value("-1"));
                    return;
                }
                    ch_[i] = ((WidgetGif *)widgets[ii->first])->GetChars()[i];
            }
            hasChars_ = true;
            return;
        }
    }
// It goes on, but I snipped it here.
}

そして、これが起こることです:

StartLayout: display_qt
Starting widget widget_gif_american_flag:layout_american_flag:0
SetupChars <widget_gif_american_flag:layout_american_flag:0> <layout_american_flag>
Size of widgets: 5
<widget_gif_american_flag:layout_american_flag:1> Widget base layout_american_flag == layout_american_flag
<widget_gif_american_flag:layout_american_flag:4> Widget base layout_american_flag == layout_american_flag
<(n
(n
��S> Widget base ГS == layout_american_flag
^C

最後の編集:私はそれを理解しました。新しいイテレータの元のマップのコピーが必要でした。

4

2 に答える 2

5

それにはかなりの理由が考えられます。1つは、マップを変更する原因となる可能性がありGetTypeます。これにより、現在のイテレータが無効になります(マップで使用すると、値を読み取るだけでも、技術的には変更操作であり、クラッシュが発生する可能性があることに注意してください)イテレータのデバッグが有効になっています!)。または、以前に実行されたコードによってマップがメモリ内で破損している可能性があります。たとえば、マップのツリーの一部がバッファオーバーランで上書きされているためです。SetupCharsStartoperator[]

于 2009-10-19T05:04:50.020 に答える
0

widgets_メソッド、、、またはを変更してはGetTypeなりSetupCharsませんStart。これはおそらくあなたの問題です。

を変更するwidgets_必要がある場合は、そのような変更が行われるたびにイテレータを再起動する必要があります。変更の重複を避けるために、ループの外側にある単純なマーカーディクショナリ、またはWidgetクラスのマーカーメンバーを使用できます。

于 2009-10-19T05:06:28.767 に答える