C ++中的矢量问题

时间:2010-04-20 21:17:31

标签: c++ stl vector

我目前正在开发一个处理People类对象向量的项目。程序编译并运行得很好,但是当我使用调试器时,它在尝试使用PersonWrangler对象时会死掉。我目前有3个不同的课程,一个是人,一个是集体处理所有人的人,一个处理游戏输入和输出的游戏类。

编辑:我的基本问题是理解为什么它在调用outputPeople时会死亡。此外,我想了解为什么我的程序完全正常工作,除非我使用调试器。 outputPeople函数按照我的预期方式工作。

编辑2:callstack有3个错误的调用:

  1. std :: vector> :: begin(this = 0xbaadf00d)
  2. std :: vector> :: size(this = 0xbaadf00d)
  3. PersonWrangler :: outputPeople(此= 0xbaadf00d)
  4. 相关代码:

    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 个答案:

答案 0 :(得分:6)

0xBAADFOODmagic number,提醒您处理未初始化的内存。从堆栈跟踪中,我们发现this中的PersonWrangler::outputPeople无效。因此hal未指向有效PersonWrangler(即假设第4帧是对Game::menu的调用)。要自己解决此类问题,请逐步执行代码,从Game::Game()开始,随时检查Game::hal,看看可能出现的问题。

Game::Game中,halshadows Game::hal的局部变量。当Game::Game退出时,此hal超出范围并泄漏内存,而Game::hal仍然未初始化。你想要的是:

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

调试器使用幻数填充未初始化的内存,以便更容易发现错误。在生产构建中,内存中没有任何特定内容;未初始化的内存的内容是未定义的,并且可能包含有效值。这就是调试构建时生产构建可能不会失败的原因。

答案 1 :(得分:1)

您是否初始化hal以指向实际的PersonWrangler对象?

创建指针不会将其指向实际对象,除非您明确地执行此操作。您可能希望在构建时将PersonWrangler传递给Game,或让Game构造函数使用new创建PersonWrangler。如果你选择后者,请确保在某个地方delete你的PersonWrangler,可能在Game deconstructor中。