aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/manager
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-12-20 18:42:04 +0100
committerLoek Le Blansch <loek@pipeframe.xyz>2024-12-20 18:42:04 +0100
commit9032dda232e5d7e178b1d9e40ab37dd25973459c (patch)
treeae02998c5b52ae29ccca34d1cc2a1b1990784399 /src/crepe/manager
parent0ba89eff9283d5f9f59fa763a19f4616f1c66d74 (diff)
fix EventManager memory leak
Diffstat (limited to 'src/crepe/manager')
-rw-r--r--src/crepe/manager/EventManager.h2
-rw-r--r--src/crepe/manager/EventManager.hpp7
2 files changed, 7 insertions, 2 deletions
diff --git a/src/crepe/manager/EventManager.h b/src/crepe/manager/EventManager.h
index 639e37f..930d950 100644
--- a/src/crepe/manager/EventManager.h
+++ b/src/crepe/manager/EventManager.h
@@ -106,7 +106,7 @@ private:
* \brief Represents an entry in the event queue.
*/
struct QueueEntry {
- std::unique_ptr<Event> event; ///< The event instance.
+ std::unique_ptr<Event, std::function<void(Event*)>> event; ///< The event instance.
event_channel_t channel = CHANNEL_ALL; ///< The channel associated with the event.
std::type_index type; ///< The type of the event.
};
diff --git a/src/crepe/manager/EventManager.hpp b/src/crepe/manager/EventManager.hpp
index a5f4556..b2090d0 100644
--- a/src/crepe/manager/EventManager.hpp
+++ b/src/crepe/manager/EventManager.hpp
@@ -22,7 +22,12 @@ void EventManager::queue_event(const EventType & event, event_channel_t channel)
static_assert(std::is_base_of<Event, EventType>::value,
"EventType must derive from Event");
this->events_queue.push_back(QueueEntry{
- .event = std::make_unique<EventType>(event),
+ // unique_ptr w/ custom destructor implementation is used because the base Event interface
+ // can't be polymorphic (= have default virtual destructor)
+ .event = {
+ new EventType(event),
+ [](Event * ev) { delete static_cast<EventType *>(ev); },
+ },
.channel = channel,
.type = typeid(EventType),
});