Удалить вызывает ошибку памяти с виртуальным деструктором в базовом классе

0

Я действительно не понимаю, почему я получаю плохой вызов функции здесь:

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, независимо от того, к чему он был добавлен?

  • 1
    Возможно повреждение памяти в коде, который вы не показали. Можете ли вы предоставить SSCCE ?
  • 0
    «У события есть публичный виртуальный деструктор». - Надеюсь, это не чисто виртуальный дестрктор?
Показать ещё 2 комментария
Теги:
pointers
delete-operator
virtual-destructor

1 ответ

0

Для того, чтобы получить нужный type_index ключ, вы должны использовать typeid() с ссылкой или разыменованным указателем, как, например, MSDN или cppreference хорошо документировать.

Поэтому измените строку, создающую type_index, на:

std::type_index index = typeid(*e);

или

auto index = std::type_index(typeid(*e));

Я считаю, что первая версия будет более четкой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню