我有一个“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);
}
}
}