代码之家  ›  专栏  ›  技术社区  ›  Brian Stewart

从boost::tokenizer检索迭代器时msvcp90d.dll崩溃

  •  2
  • Brian Stewart  · 技术社区  · 15 年前

    当我检索boost::tokenizer的begin()迭代器时,我在msvcp90d.dll中遇到了一个崩溃,即“迭代器列表已损坏”,这看起来像是我以前在使用“has”迭代器“调试编译器”标志时遇到的问题,但是我已经验证了我的程序是在关闭此标志的情况下编译的。

    程序如下:

    #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);
    

    因此,它似乎与奥斯汀流有关。有什么想法吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   James McNellis    15 年前

    a bug in Visual C++ 具有 std::ostringstream 什么时候 _HAS_ITERATOR_DEBUGGING 已禁用。

    如果我记得正确的话, std::string 复制构造函数复制迭代器。你可以通过使用 标准::字符串 转换构造函数采用 char* 相反。

    如果你改变

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

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

    然后不会引发异常。