2

boost::tokenizer の begin() イテレータを取得すると、msvcp90d.dll でクラッシュが発生し、「ITERATOR LIST CORRUPTED」と表示されます。これは、_HAS_ITERATOR_DEBUGGING コンパイラ フラグで以前に遭遇した問題のように疑わしいように見えますが、このフラグをオフにしてプログラムがコンパイルされていることを確認しました。

プログラムは次のとおりです。

#include <sstream>
#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>


int main(int argc, char* argv[])
{
    std::string data("gobo;wimbley;red;moki;boober");
    std::ostringstream input;
    input << data;


    std::string mystr(input.str());
    boost::char_separator<char> separator(";");
    boost::tokenizer<boost::char_separator<char>> tok(mystr, separator);
    boost::tokenizer<boost::char_separator<char>>::iterator iter = tok.begin();
}

興味深いことに、トークナイザーのインスタンス化を次の行に置き換えると、機能します。

    boost::tokenizer<boost::char_separator<char>> tok(data, separator);

そのため、ostringstream に関連するものと思われます。何か案は?

4

1 に答える 1

3

Visual C++ には、 when が無効になっているバグstd::ostringstreamあり_HAS_ITERATOR_DEBUGGINGます。

私の記憶が正しければ、std::stringコピー コンストラクターは反復子をコピーします。std::string代わりにa を取る変換コンストラクターを使用することで、これを回避できますchar*

変えたら

std::string mystr(input.str());

std::string mystr(input.str().c_str());

例外はスローされません。

于 2009-11-05T17:31:38.070 に答える