在以下函数中的行std::ifstream fileOpen(file.c_str());
,程序崩溃并给我这个错误:
此应用程序已请求Runtime以不寻常的方式终止它。 请联系应用程序的支持团队以获取更多信息。
流程以退货值3退出
但是,在调试模式下,整个程序会运行,但是在主函数的返回0语句中
编程接收信号SIGTRAP,跟踪/断点陷阱。
我在Windows 7上使用Orwell Dev / C ++。从我可以收集到的第一个问题是抛出但未被捕获的异常(我还没有自学过异常,所以我不知道如何处理这个问题,但我可以阅读),它可能会破坏堆栈。后一个错误我无法获得更多具体信息。有谁能请我指出解决方案的方向?哦,此外,该函数在第四次崩溃之前被调用三次。
//Get a line of data from a file
std::string getData( std::string file, int line )
{
std::string data;
std::ifstream fileOpen(file.c_str());
if (fileOpen.is_open())
{
if( fileOpen.good() )
{
for( int lineno = 0; getline(fileOpen,data) && lineno < line; lineno ++ )
{
if( lineno != line )
{
data = "";
}
}
}
fileOpen.close();
}
return data;
}
//Parse comma delimited string into a vector
void parseData( std::vector<double> &temp, std::string data )
{
std::istringstream ss(data);
std::string token;
while(std::getline(ss, token, ','))
{
temp.push_back(atoi(token.c_str()));
}
}
这些由以下代码调用:
std::string instData = getData( levelName+".dat", 2 );
if( instData != "" )
{
parseData( temp, instData );
instances.resize(temp.size() / 4);
j = 0;
for( int i = 0; i < temp.size(); i += 4 )
{
instances[ j ].type = temp[ i ];
instances[ j ].xPos = temp[ i + 1 ];
instances[ j ].yPos = temp[ i + 2 ];
instances[ j ].zIndex = temp[ i + 3 ];
j ++;
}
temp.clear();
}
此代码本身是一个函数的一部分,该函数旨在使用指定文件中的数据填充各种向量。其中的其余代码与上面的代码基本相同。
答案 0 :(得分:1)
我可以清楚地看到这里有问题:
instances[ j ].xPos = temp[ i + 1 ];
instances[ j ].yPos = temp[ i + 2 ];
instances[ j ].zIndex = temp[ i + 3 ];
当i == temp.size() - 3
时,最后一个语句将访问temp
分配的内存末尾之后的内存区域1,从而导致Undefined Behavior。在此之后,您的程序进入了无效状态。
在打开文件的行中获取错误可能只是未定义行为的影响之一。作为测试,删除上面三行,看看是否发生任何运行时错误。