2010-06-11 9 views
5

Dưới đây là một số mã:C++ stack overflow

void main() 
{ 
    GameEngine ge("phil", "anotherguy"); 
    string response; 
    do { 
     ge.playGame(); 
     cout << endl << "Do you want to (r)eplay the same battle, (s)tart a new battle, or (q)uit? "; 
     cin >> response; 
    } while(response == "r" || response == "R" || response == "s" || response == "S"); 
} 

GameEngine::GameEngine(string name1, string name2) 
{ 
    p1Name = name1; 
    p2Name = name2; 
} 

void GameEngine::playGame() 
{ 
    cout << "PLAY GAME" << endl; 
    Army p1, p2; 
    Battlefield testField; 
    RuleSet rs; 

    int xSize = 13; // Number of rows 
    int ySize = 13; // Number of columns 

    loadData(p1, p2, testField, rs, xSize, ySize); 

    ... 
} 

void GameEngine::loadData(Army& p1, Army& p2, Battlefield& testField, RuleSet& rs, int& xSize, int& ySize) 
{ 
    string terrain = BattlefieldUtils::pickTerrain(); 
    string armySplit[14];//id index 1 
    string ruleSplit[19];//in index 7 
    string armyP1, armyP2, ruleSet; 
    Skill p1Skills[8]; 
    Skill p2Skills[8]; 
    CreatureStack p1Stacks[20]; 
    CreatureStack p2Stacks[20]; 

    ... 
} 

CreatureStack(){quantity = 0; isLive = false; id = -1;}; 

Army(){}; 

Battlefield(){}; 

RuleSet(){}; 

Tôi đã đăng tải tất cả các dòng mã thực thi cho đến khi chương trình bị treo. Mã này chạy tốt trong một thời gian dài, tôi đã thêm một số nội dung thậm chí không thực thi cho đến khi mã tôi đã đăng ở đây và bam, tràn ngăn xếp xảy ra tại GameEngine::loadData() dòng: CreatureStack p2Stacks[20]; sẽ không biến mất. Tôi làm gì sai ở đây? Là tất cả các ngăn xếp có thể xử lý? Tôi tăng kích thước ngăn xếp trong Visual Studio và có lỗi để biến mất, nhưng điều đó làm chậm đáng kể, vì vậy làm thế nào để tôi có được nguồn gốc của vấn đề và khắc phục điều đó?

+0

Các đối tượng này bạn đang lưu trữ trên ngăn xếp bao nhiêu? (Giống như CreatureStack, Battlefield, RuleSet, vv) –

+2

Bạn có chắc chắn rằng bạn không bằng cách nào đó gọi 'loadData()' (hoặc 'playGame()') đệ quy? – sth

+0

Bạn nên sử dụng trình gỡ rối và in dấu vết ngăn xếp. Điều đó sẽ cho bạn biết nếu vấn đề là đệ quy vô hạn (và những gì chu kỳ cuộc gọi là) hoặc nếu độ sâu của các cuộc gọi là nhỏ và vấn đề là số lượng dữ liệu được lưu trữ trong ngăn xếp chính nó. –

Trả lời

4

Rõ ràng, CreatureStack là một đối tượng lớn. Bạn đang phân bổ 20 trong số đó trên ngăn xếp. Kết quả: ngăn xếp tràn.

Thay vào đó, hãy đổi thành new hoặc malloc cho mảng CreatureStack của bạn, chuyển chúng vào bộ nhớ heap thay vì ngăn xếp.

Đừng quên giải phóng chúng khi hoàn tất.

+1

Tôi khuyên bạn nên lưu trữ 'CreatureStack' trong một con trỏ thông minh, chẳng hạn như 'boost :: shared_ptr'so mà bạn không phải nhớ xóa chúng. http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm –

+6

Hoặc một std :: vector của CreatureStacks có thể dễ dàng hơn vì nó sẽ tự giải phóng :) – Peter

+0

Bạn không nên đề nghị mọi người sử dụng malloc() để phân bổ lưu trữ cho một đối tượng C++. –