C ++ Segfault,我不知道为什么?

时间:2013-10-30 13:06:59

标签: c++ arrays segmentation-fault runtime-error

我在头文件中声明了一个数组:

private:
   int frames[10];

并在类构造函数中赋值,如下所示:

file.open(File);
if(file.is_open())
{
    std::string line;
    getline(file, line);
    std::string param[10];
    std::stringstream stream(line);
    int n=0;
    while(!stream.eof())
    {
        getline(stream, param[n], '$');
        frames[n] = atoi(param[n].c_str());
        n++;
    }
    file.close();
}

稍后此数组用于函数:

currentFrame++;
if(frames[currentAnimation] <= currentFrame)
{
    currentFrame = 0;
}

当我运行时,我运行我的代码,我得到分段错误,gdb返回:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000402c22 in Sprite::update (this=0x7ffff6efe678 <main_arena+88>) at Sprite.cpp:93 93              
if(frames[currentAnimation] <= currentFrame)
(gdb) bt
#0  0x0000000000402c22 in Sprite::update (this=0x7ffff6efe678 <main_arena+88>) at Sprite.cpp:93
#1  0x0000000000401fcb in main (argc=1, argv=0x7fffffffeb88) at main.cpp:146

我不确定我哪里出错了,我认为错误就在这里。 我不能真正发布所有代码,但如果你需要的话 具体信息请问。

非常感谢你。

3 个答案:

答案 0 :(得分:3)

试试这个

private:
   std::vector<int> frames;


file.open(File);
if(file.is_open())
{
    std::string line;
    getline(file, line);
    std::string param;
    std::stringstream stream(line);
    while(getline(stream, param, '$'))
        frames.push_back(atoi(param.c_str()));
    file.close();
}

currentFrame++;
if( currentAnimation < frames.size() && frames[currentAnimation] <= currentFrame)
{
    currentFrame = 0;
}

See Loki's answer for why while(!stream.eof()) is bad

答案 1 :(得分:0)

int n=0;
while(!stream.eof() && n < 10)
{

...

currentFrame++;
if(currentFrame < 10 && frames[currentAnimation] <= currentFrame)
{
    currentFrame = 0;
}

或使用类似

的内容
currentFrame = (currentFrame + 1) % 10;

答案 2 :(得分:0)

几个问题:

这里只有10个项目:

std::string param[10];

但是这里没有检查10:

while(!stream.eof())

所以这可能会增加10个以上,这肯定会引起问题。

这种形式的循环几乎总是错误的:

while(!stream.eof())
{
    getline(stream, param[n], '$');
    frames[n] = atoi(param[n].c_str());
    n++;
}

如果输入中有任何不良数据,则会进入无限循环。否则,当您到达EOF时,std::getline()无法读取数据并设置eof标志,但仍然分配给帧(并增加n)。错误数据的atoi()返回0,因此Frames中的最后一个元素将为零(不确定这是否是预期的行为(但是它的草率)。

正确的风格是将读取放入while条件。所以将这两个东西加在一起就可以看起来像这样。

while(n < 10 && getline(stream, param[n], '$'))
{
    // loop is only entered if the read succeed.

    // Not sure about the type of `frames` so hard to talk about
    // if this loop is still correct. The meaning has changed slightly.
    frames[n] = atoi(param[n].c_str());
    n++;
}
if (n < 10) {/*We have an issue with not enough data!*/}