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++ 中有一个错误,禁用时std::ostringstream_HAS_ITERATOR_DEBUGGING

如果我没记错的话,std::string复制构造函数复制迭代器。您可以通过使用std::string转换构造函数来解决这个问题char*

如果你改变

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

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

那么不会抛出异常。

于 2009-11-05T17:31:38.070 回答