2010-04-20 104 views
1

我目前正在處理一個處理People類對象向量的項目。該程序編譯並運行得很好,但是當我使用調試器時,它會在試圖用PersonWrangler對象做任何事情時死亡。我目前有三個不同的課程,一個是人,一個是集體處理所有人的personwrangler,一個是處理遊戲輸入和輸出的遊戲課程。C++中的向量錯誤

編輯:我的基本問題是瞭解爲什麼它會在調用outputPeople時死去。另外我想了解爲什麼我的程序完全按照它應該的方式工作,除非我使用調試器。 outputPeople函數以我想要的方式工作。

編輯2:調用堆棧有3個壞呼叫它們是:

  1. 的std ::矢量> ::開始(這= 0xbaadf00d)
  2. 的std ::矢量> ::大小(此= 0xbaadf00d )
  3. PersonWrangler :: outputPeople(此= 0xbaadf00d)

相關的代碼:

class Game 
{ 
public: 
    Game(); 
    void gameLoop(); 
    void menu(); 
    void setStatus(bool inputStatus); 
    bool getStatus(); 
    PersonWrangler* hal; 
private: 
    bool status; 
}; 

它調用outputPeople它立即死於baadf00d錯誤。

void Game::menu() 
{ 
    hal->outputPeople(); 
} 

其中Hal是PersonWrangler型

class PersonWrangler 
{ 
public: 
    PersonWrangler(int inputStartingNum); 
    void outputPeople(); 
    vector<Person*> peopleVector; 
    vector<Person*>::iterator personIterator; 
    int totalPeople; 
}; 

和outputPeople功能的目標被定義爲

void PersonWrangler::outputPeople() 
{ 
    int totalConnections = 0; 
    cout << " Total People:" << peopleVector.size() << endl; 
    for (unsigned int i = 0;i < peopleVector.size();i++) 
    { 
     sort(peopleVector[i]->connectionsVector.begin(),peopleVector[i]->connectionsVector.end()); 
     peopleVector[i]->connectionsVector.erase(unique (peopleVector[i]->connectionsVector.begin(),peopleVector[i]->connectionsVector.end()),peopleVector[i]->connectionsVector.end()); 
     peopleVector[i]->outputPerson(); 
     totalConnections+=peopleVector[i]->connectionsVector.size(); 
    } 
    cout << "Total connections:" << totalConnections/2 << endl; 
} 

其中Hal是初始化

Game::Game() 
{ 
    PersonWrangler* hal = new PersonWrangler(inputStartingNum); 
} 
+0

你的問題是什麼? – 2010-04-20 21:19:27

+0

連接矢量在哪裏? – 2010-04-20 21:20:17

+0

你有什麼理由使用這麼多的指針?原始指針的使用在C++中是不鼓勵的。 – 2010-04-20 21:21:24

回答

6

0xBAADFOOD是一個magic number提醒你,你正在處理未初始化的內存。從堆棧跟蹤中,我們看到thisPersonWrangler::outputPeople中無效。因此hal沒有指向有效的PersonWrangler(也就是說,假設第4幀是對Game::menu的調用)。要自己解決這類問題,請逐步執行代碼,從Game::Game()開始,隨時檢查Game::hal,查看可能出現的問題。

Game::Game,hal是一個局部變量shadowsGame::hal。當Game::Game退出時,此hal超出範圍並泄漏內存,而Game::hal保持未初始化狀態。你想要的是:

Game::Game() 
{ 
    hal = new PersonWrangler(inputStartingNum); 
} 

調試器填充未初始化的內存與幻數,以便更容易發現錯誤。在生產版本中,內存中沒有特別的東西;未初始化內存的內容未定義,並可能保存有效值。這就是爲什麼生成構建可能不會在調試構建時失敗的原因。

1

你初始化hal指向一個實際的PersonWrangler對象?

創建指針不會將其指向實際對象,除非您明確地指定它。您可能希望在構建時將PersonWrangler傳遞給您的遊戲,或讓遊戲構造函數使用new創建PersonWrangler。如果您選擇後者,請務必在您的PersonWrangler delete處,可能位於遊戲解構器中。