【发布时间】:2013-12-08 09:31:31
【问题描述】:
我真的不明白为什么我在这里得到错误的函数调用:
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);
}
不幸的是,类型是 ALWAYS Event,但我需要的是对象的派生类型(在这种情况下是 LogEvent,它是从 Event 派生的)。我是否需要将其设为模板函数,或者是否有办法获取对象的 ACTUAL 类型,无论它被转换为什么?
【问题讨论】:
-
您未显示的代码中可能存在内存损坏。你能提供一个SSCCE吗?
-
"事件有一个公共的虚拟析构函数。" - 希望不是纯虚拟破坏者?
-
我不认为它是纯粹的:public: virtual ~Event() {};
-
在回调绑定[it->first](e);你检查过 it-> first 是一个有效的索引并且 callbackBindings[it->first] 不是一个空指针吗?
标签: c++ pointers delete-operator virtual-destructor