Векторные проблемы в C ++ - PullRequest
1 голос
/ 21 апреля 2010

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

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

Редактировать 2: в стеке вызовов 3 неверных вызова:

  1. std :: vector> :: begin (this = 0xbaadf00d)
  2. std :: vector> :: size (this = 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);
}

Ответы [ 2 ]

6 голосов
/ 21 апреля 2010

0xBAADFOOD - это магическое число , предупреждающее вас о том, что вы имеете дело с неинициализированной памятью. Из трассировки стека мы видим, что this в PersonWrangler::outputPeople недопустимо. Таким образом, hal не указывает на действительный PersonWrangler (то есть, если предположить, что кадр 4 является вызовом Game::menu). Чтобы решить эту проблему самостоятельно, пошагово пройдитесь по коду, начиная с Game::Game(), проверяя на ходу Game::hal, чтобы увидеть, что может пойти не так.

В Game::Game, hal является локальной переменной, которая shadows Game::hal. Когда Game::Game выходит, этот hal выходит из области видимости и теряет память, тогда как Game::hal остается неинициализированным. То, что вы хотите:

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

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

1 голос
/ 21 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...