2010-04-20 4 views
1

В настоящее время я работаю над проектом, который посвящен вектору объектов класса People. Программа компилируется и работает очень хорошо, но когда я использую отладчик, он умирает, когда пытается что-либо сделать с объектом PersonWrangler. В настоящее время у меня есть 3 разных класса: один для человека, человек, который занимается всеми людьми коллективно, и класс игры, который обрабатывает ввод и вывод игры.Vector Troubles in C++

Редактировать: Мой основной вопрос - понять, почему он умирает, когда он вызывает outputPeople. Также я хотел бы понять, почему моя программа работает точно так, как она должна, если я не использую отладчик. Функция outputPeople работает так, как я предполагал.

Edit 2: CallStack имеет 3 плохие вызовы, которые являются:

  1. станд :: вектор> :: начать (это = 0xbaadf00d)
  2. станд :: вектор> :: размер (этот = 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; 
} 

Где гал инициализируется

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

Что вы думаете? – 2010-04-20 21:19:27

+0

Где находится вектор соединений? –

+0

Есть ли причина, по которой вы используете столько указателей? Использование Raw-указателя не рекомендуется на C++. –

ответ

6

0xBAADFOOD является magic number, чтобы предупредить вас о том, что вы имеете дело с неинициализированной памятью. Из трассировки стека мы видим, что в PersonWrangler::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); 
} 

Debuggers заполнить неинициализированную память с магическими числами, чтобы сделать его легче обнаружить ошибки. В производственной сборке память не заполнена чем-либо в частности; содержимое неинициализированной памяти не определено и может содержать допустимые значения. Вот почему сборка сборки может не сработать, когда будет построена отладка.

1

ли вы инициализировать hal, чтобы указать на объект PersonWrangler?

Создание указателя не указывает его на фактический объект, если вы не сделаете это явно. Вероятно, вы захотите либо передать PersonWrangler в свою игру во время построения, либо создать конструктор игры PersonWrangler, используя new. Если вы выберете последнее, убедитесь, что у вашего PersonWrangler есть delete, возможно, в деконструкторе игры.