神秘的std :: list :: size()不匹配

时间:2014-06-23 19:57:36

标签: c++ list c++11 iterator

我有一个“list iterator not dereferencable”错误。我认为这通常是由于尝试在列表中进行迭代而导致的,但是我无法找到它的原因。我严格遵守std::list API的功能,因此我不知道下面的代码究竟出了什么问题导致此错误。

这个错误有一些谜团。在GameStateManager::HandleEvents()迭代期间,此问题的主要焦点是list。在破解时,我在列表中添加了五个元素,每个元素称为list::remove()(制作一个空列表)并添加了四个元素。但是,正如您在下面看到的那样,我在迭代之前打印列表的大小。在调试时,这显示出令人困惑的东西 - 由list::size()返回的大小与实际大小不同(通过Visual Studio调试器在list :: size变量本身中查看)。这只发生在错误之前 - 通常两个值都相同。但是,在错误发生之前,size()返回的值不等于列表的size成员值。在删除第一个元素之前,它始终包含先前的值。我不禁感到这种差异与“list iterator not dereferencable”错误有关。

另外令人困惑的是,打印命令在错误触发代码之前不可执行。此外,在GameStateManager::HandleEvents()中,在致命for循环之前不会触发自定义断点。也许这些异常是单独的问题,但我认为它们可能有用。

GameStateManager.h

#pragma once
#include "Tools.h"
#include "TitleScreenState.h"
#include "Game.h"
#include "Timer.h"
#include <list>

class GameState;
class EventHandler;

class GameStateManager
{
public:
    GameStateManager(void);
    ~GameStateManager(void) { m_currentState->OnEnd(); }

    void Run(void);
    void Quit(void) { m_running = false; }

    // Event Handler Functions
    void AddHandler(EventHandler* handler) { m_eventHandlers.emplace_back(handler); }
    void RemoveHandler(EventHandler* handler) { m_eventHandlers.remove(handler); }

private:
    std::list<EventHandler*> m_eventHandlers; // All of the handlers who are passed the events
    bool m_running; // The universal boolean for whether or not the program is running
    int delta; // The time since the last frame
    Timer m_FPSTimer; // The timer that keeps track of the time since the last update
    GameStateID startStateID;

    GameState* m_currentState; // Pointer to the current game state

    // Poll and pass events to the current state
    void HandleEvents(void);
};

GameStateManager.cpp

#include "GameStateManager.h"
#include "EventHandler.h"
#include "ToolKit.h"
#include "Game.h"
#include <time.h>

GameStateManager* g_manager = nullptr;

GameStateManager::GameStateManager(void) 
    : m_eventHandlers(), delta(0), m_running(true), startStateID(GSID_TITLE), 
      m_currentState(nullptr), m_titleScreen(nullptr), m_game(nullptr)
{
    // Initialise time
    srand(time(nullptr));
}


void GameStateManager::Run(void)
{
    Initialise();

    while (m_running)
    {
        // State's key press responses
        m_currentState->OnKeys(SDL_GetKeyboardState(nullptr));
        // Update State
        m_currentState->OnUpdate(delta);
        // Render State
        m_currentState->OnRender();

        HandleEvents();
    }

    delete this;
}


void GameStateManager::HandleEvents(void)
{
    // Respond to events
    SDL_Event event;
    while(SDL_PollEvent(&event))
    {
        if (event.type == SDL_QUIT) {
            m_running = false; // Quit
        }
        else 
        {
            int size = m_eventHandlers.size();
            printf("Whooo! Size: %d\n", size);

            for (EventHandler* handler : m_eventHandlers)
                handler->OnEvent(event);
        }
    }
}

0 个答案:

没有答案