string迭代器不是dereferencable

时间:2016-10-07 18:06:47

标签: c++ visual-studio-2012

我正在使用库来解析.pgn文件,当我尝试运行该项目时,我发现了这个错误:Debug Assertion失败了!程序:C:\ windows \ SYSTEM32 \ MSVCP110D.dll文件:c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xstring 行:79 表达式:字符串迭代器不可解除引用 有关程序如何导致断言失败的信息,请参阅有关断言的可视化C ++文档。

问题是,当迭代器到达文件的末尾时,它指向什么(启动iterator(itr1)==结束迭代器(itr2)),我试图添加条件来检查itr1是否到达最后该文件,但它没用。 请告诉我我的错在哪里。 这是我的代码source.cpp文件:

#include <iostream>
#include <fstream>
#include <PGNGameCollection.h>
int main()
{
    std::ifstream pgnfile("sample.pgn");
    pgn::GameCollection games;
    pgnfile >> games;
    std::cout << "the file sample.pgn contains " << games.size() << "games"     << std::endl;
    system("pause");
    return 0;
}

以下是导致错误的类函数:

bool pgn::Parser::getComment(std::string::const_iterator &itr1, const std::string::const_iterator &itr2, pgn::CommentText &out)
{
    std::string::const_iterator local_itr=itr1;
    std::string comment;
    if(*local_itr != '{')
        return false;
    local_itr++; //skipping '{'

    while((*local_itr != '}') && (local_itr != itr2))
    {
        comment += *local_itr++;
    }
    local_itr++; //skipping '}'
    skipBlanks(local_itr, itr2);
    itr1=local_itr;
    out=pgn::CommentText(comment);
    return true;
}

skipBlanks功能:

void pgn::Parser::skipBlanks(std::string::const_iterator &itr1, cost std::string::const_iterator &end)
{
    while((itr1 != end) && (isspace(*itr1)))
    {
        itr1++;
    }
}

我已经搜索了stackoverflow和谷歌搜索所有类似的问题,但我找不到答案。我也逐行跟踪代码,直到找到导致错误的函数。

1 个答案:

答案 0 :(得分:1)

如果itr2是您的结束迭代器,那么在尝试取消引用它之前,您必须检查迭代器中的结束条件

while((local_itr != itr2) && (*local_itr != '}'))

你正在反过来这样做,这肯定会导致你所描述的问题。

在函数的最开始添加对结束条件的检查也是有意义的,因为您还要解除引用local_itr

此外,如果您的周期因local_itr到达itr2而终止,并且在itr2及其之后没有任何内容,那么周期后的代码就没有意义了。在这种情况下,您不能增加local_itr