[Cuppa-users:114] VC6のバグ?

Zurück zum Archiv-Index

zain zain****@po*****
2002年 8月 28日 (水) 00:29:12 JST


zain と申します。

ようやく環境を整え胡瓜を使って自動生成を始めようとしているところ
です(今まではがりがり手動です)。
# ただ、U/Iのタイミング関係がメインなのでなかなかCppUnit自体を活用
# できずにいることが多々あります。

VC6+SP5でBuildして胡瓜一発目でいきなり落ちるハメになりました。
ネタ的にはcppll向けですが、こちらで既出ではないと思われますので、
こちらで報告いたします。

調べてみると、
void Curie::checkClassDefs() {
... 略
    while (metit != defit->methods_.end()){       // << (***1)
        if (metit->name_.at(0) == '~'){           // << (***3)
            Methods::iterator itsaved = metit++;
            defit->methods_.erase(itsaved);       // << (***2)
        }
        else
            ++metit;
    }
... 略
}
の、(***1)(***2)部分が原因です。
ケースとしてはmetitの一番最後にデストラクタが入っている場合です。
まず(***2)で削除が発生します。
で次にmetitはend()を指しているはず・・・なのですが、(**1)へ来て比
較を実行すると見事に通り抜けてしまいます。
metitは全く変なポインタになっているので(**3)で落ちます。
erase()によってvectorのend()が変化するのがSTLとして正しいのかがポ
イントになると思われますが、どうなのでしょうか?

ただ報告だけというのも何なので解決策を自分なりに考えてみました。
上記の対応としては、if 文の中身を
metit = defit->methods_.erase(metit);
にするというので良いでしょうか?

-- 
zain <zain****@po*****>





Cuppa-users メーリングリストの案内
Zurück zum Archiv-Index