2014-08-31 107 views
0

我一直在困惑我的程序的行爲與某些對象分配一段時間了。在void函數中創建(大)對象失敗原因不明

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並在自己的void功能10(Game b; b.start();),

static void startGame(); 

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

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

程序很快崩潰(分段錯誤)在循環的一次迭代之後。在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

函數'startGame'顯然不是問題,'main'堆棧在應用程序終止前不會被釋放。你的代碼中必然存在一些錯誤(很可能與指針和內存分配有關),這些錯誤在某些情況下才會出現。 – 2014-08-31 00:59:48

+0

除非您的遊戲非常短,否則您可能不希望它超出範圍或在創建後立即將其刪除。 – 2014-08-31 01:01:43

+0

@MartinLiversage這聽起來很正確。 – plunk654 2014-08-31 01:06:56

回答

1

看起來像你的遊戲類寫入到其控制之外的內存,從而破壞堆或堆棧,取決於你分配的位置。在「遊戲」中尋找緩衝區溢出。