显然,当我的代码到达此if
语句时,会发生string subscript out of range
异常。
// a is int
// str is std::string
while ( true )
{
// other stuff
if( a == str.size() ) // this line throws an exception
break;
}
在什么情况下这样简单的if语句会抛出异常?我只是没有看到它。如果由于某种原因比较失败,它不应该只返回0
吗?
编辑: 这是它发生的全部功能。它基本上读取文件并接受其中某些标记的值。 如果它具有一定的相关性,我使用 Visual Studio 2010 Express 并且错误显示“Debug Assertion Failed”。
void Function(string &str, int start)
{
int outline;
// Read all attributes
int pos, pos2 = start;
while( true )
{
pos = SkipWhiteSpace(str, pos2);
pos2 = FindEndOfToken(str, pos);
string token = str.substr(pos, pos2-pos);
pos = SkipWhiteSpace(str, pos2);
if( pos == str.size() || str[pos] != '=' ) break;
pos = SkipWhiteSpace(str, pos+1);
pos2 = FindEndOfToken(str, pos);
file<<"...part 3";
string value = str.substr(pos, pos2-pos);
if( token == "outline" )
outline = (short)strtol(value.c_str(), 0, 10);
if( pos == str.size() ) // <--- error here (at least, it seems so)
break;
}
SetOutline(outline);
}
SkipWhiteSpace()
和FindEndOfToken()
函数就是这两个函数。
int SkipWhiteSpace(string &str, int start)
{
UINT n = start;
while( n < str.size() )
{
char ch = str[n];
if( ch != ' ' &&
ch != '\t' &&
ch != '\r' &&
ch != '\n' )
break;
++n;
}
return n;
}
int FindEndOfToken(string &str, int start)
{
UINT n = start;
if( str[n] == '"' )
{
n++;
while( n < str.size() )
{
char ch = str[n];
if( ch == '"' )
{
// Include the last quote char in the token
++n;
break;
}
++n;
}
}
else
{
while( n < str.size() )
{
char ch = str[n];
if( ch == ' ' ||
ch == '\t' ||
ch == '\r' ||
ch == '\n' ||
ch == '=' )
break;
++n;
}
}
return n;
}
答案 0 :(得分:0)
此行永远不会抛出异常。你确定你得到的是真正的C ++异常而不是崩溃吗?