【问题标题】:Crash in msvcp90d.dll when retrieving an iterator from a boost::tokenizer从 boost::tokenizer 检索迭代器时,msvcp90d.dll 崩溃
【发布时间】:2009-11-05 00:54:57
【问题描述】:

当我检索 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有关。有什么想法吗?

【问题讨论】:

  • 你的代码 sn-p 对我来说很好。

标签: c++ stl crash iterator compiler-flags


【解决方案1】:

_HAS_ITERATOR_DEBUGGING 被禁用时,有a bug in Visual C++std::ostringstream

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

如果你改变了

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

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

那么不会抛出异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2022-01-10
    • 1970-01-01
    • 2016-12-31
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多