我真的不明白为什么我在这里得到了糟糕的函数调用:
Event* e = *(it->second.begin());
callbackBindings[it->first](e);
delete e;
CCD_ 1是从CCD_ 2派生的对象的实例。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);
}
不幸的是,类型是ALWAYS Event,但我需要的是对象的派生类型(在本例中为LogEvent,它是从Event派生的)。我需要把它变成一个模板函数吗?或者有没有一种方法可以获得对象的实际类型,无论它被转换成什么?
为了获得所需的type_index
密钥,您必须使用带有引用或取消引用指针的typeid()
,例如msdn或cppreference welly document。
因此,将创建type_index的行更改为:
std::type_index index = typeid(*e);
或
auto index = std::type_index(typeid(*e));
我相信第一个版本会更清晰。