Я действительно не понимаю, почему я получаю плохой вызов функции здесь:
Event* e = *(it->second.begin());
callbackBindings[it->first](e);
delete e;
e
- это экземпляр объекта, полученного из Event
. Event
имеет открытый виртуальный деструктор. Мой производный класс имеет пустой, но реализованный деструктор. delete e
дает мне ошибку памяти здесь. Зачем? (e
- действительный указатель)
редактировать: полный код, может быть, он помогает:
#include "EventHandler.h"
std::unordered_map<std::type_index, std::function<void(Event*)>> EventHandler::callbackBindings = std::unordered_map<std::type_index, std::function<void(Event*)>>();
std::unordered_map<std::type_index, std::list<Event*>> EventHandler::eventList = std::unordered_map<std::type_index, std::list<Event*>>();
void EventHandler::Update()
{
auto it = eventList.begin();
while(it != eventList.end())
{
if(it->second.size() < 1) //erase empty event lists!
{
eventList.erase(it++);
}
else
{
if(callbackBindings.count(it->first) < 0) //erase events without listener!
{
//delete all messages
auto eventIt = it->second.begin();
while(eventIt != it->second.end())
{
Event* e = *(eventIt++);
delete e;
}
//remove list entry
eventList.erase(it++);
}
else //perform callback
{
auto eventIt = it->second.begin();
while(eventIt != it->second.end())
{
//dereference iterator for ease of use & iterate
Event* e = *(eventIt++);
//callback function
callbackBindings[it->first](e);
//remove event from list
it->second.remove(e); //with a single message, this is where it crashes!
//delete event
delete e;
}
++it;
}
}
}
}
Хорошо, ошибка, кажется, где-то в другом месте. Когда я прокомментирую
callbackBindings[it->first](e);
Это не сбой?!
Предполагается, что следующая функция помещает объект в карту, индексированную по типу:
static void DispatchEvent(Event* e)
{
//te.event = e;
auto index = std::type_index(typeid(&e));
//eventList.push_back(te);
if(eventList.count(index) < 1)
{
eventList[index] = std::list<Event*>();
}
eventList[index].push_back(e);
}
К сожалению, этот тип является событием ALLWAYS, но мне нужен производный тип объекта (LogEvent в этом случае, который является производным от Event). Мне нужно сделать это функцией шаблона или есть способ получить тип объекта ACTUAL, независимо от того, к чему он был добавлен?
Для того, чтобы получить нужный type_index
ключ, вы должны использовать typeid()
с ссылкой или разыменованным указателем, как, например, MSDN или cppreference хорошо документировать.
Поэтому измените строку, создающую type_index, на:
std::type_index index = typeid(*e);
или
auto index = std::type_index(typeid(*e));
Я считаю, что первая версия будет более четкой.