在void函数中创建(大)对象因未知原因而失败

时间:2014-08-31 00:50:15

标签: c++

我的程序在某些对象分配方面的行为已经困扰了一段时间。

我的main()函数运行如下:

const int numOpts = 3;
string opts[numOpts] = { "Play", "Settings", "Quit" };
                        // 0       1           2
for (;;)
{
    int choice = input(numOpts); // returns 0, 1, or 2
    if (choice == 0)
    {
        Game b; // 9
        b.start(); // 10
    }
    else if (choice == 1)
        settings(); // edits global variables
    else
        break;
}

但是,当我尝试将第9行和第10行(Game b; b.start();)放入自己的void函数时,

static void startGame();

int main()
{
    ...
    if (choice == 0)
        startGame();
    ...
}

static void startGame()
{
    Game b;
    b.start();
}

程序很快在for (;;)循环的一次迭代后崩溃(分段错误)。在Xcode中,main()似乎在调用startGame()后忘记了所有变量。类似地,

static void startGame()
{
    Game* b = new Game;
    b->start();
    delete b;
}

也失败了:但不是在我自己的操作系统(OS X)上,而是在Linux机器上。此输出的失败如下所示:*** glibc detected *** ./Game: free(): invalid next size (fast): 0x0000000001b41d60 *** ...

这些问题是否相关?我怀疑main()的堆栈数据在某种程度上被释放,但如果是这样,为什么第一个实现工作,而不是接下来的两个?

1 个答案:

答案 0 :(得分:1)

看起来你的Game类会写入不受其控制的内存,从而破坏堆或堆栈,具体取决于你分配它的位置。在“游戏”中查找缓冲区溢出。