我的程序在某些对象分配方面的行为已经困扰了一段时间。
我的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()
的堆栈数据在某种程度上被释放,但如果是这样,为什么第一个实现工作,而不是接下来的两个?
答案 0 :(得分:1)
看起来你的Game类会写入不受其控制的内存,从而破坏堆或堆栈,具体取决于你分配它的位置。在“游戏”中查找缓冲区溢出。