Implemented delayed destruction of Dialog in MenuManager to avoid "delete this" type...
authorIngo Ruhnke <grumbel@gmail.com>
Tue, 26 Aug 2014 07:03:24 +0000 (09:03 +0200)
committerIngo Ruhnke <grumbel@gmail.com>
Tue, 26 Aug 2014 22:57:44 +0000 (00:57 +0200)
src/gui/menu_manager.cpp
src/gui/menu_manager.hpp

index b493ba6..a3c4b8e 100644 (file)
@@ -136,6 +136,8 @@ public:
 
 MenuManager::MenuManager() :
   m_dialog(),
+  m_has_next_dialog(false),
+  m_next_dialog(),
   m_menu_stack(),
   m_transition(new MenuTransition)
 {
@@ -190,6 +192,12 @@ MenuManager::event(const SDL_Event& ev)
 void
 MenuManager::draw(DrawingContext& context)
 {
+  if (m_has_next_dialog)
+  {
+    m_dialog = std::move(m_next_dialog);
+    m_has_next_dialog = false;
+  }
+
   if (m_transition->is_active())
   {
     m_transition->update();
@@ -222,7 +230,10 @@ MenuManager::draw(DrawingContext& context)
 void
 MenuManager::set_dialog(std::unique_ptr<Dialog> dialog)
 {
-  m_dialog = std::move(dialog);
+  // delay reseting m_dialog to a later point, as otherwise the Dialog
+  // can't unset itself without ending up with "delete this" problems
+  m_next_dialog = std::move(dialog);
+  m_has_next_dialog = true;
 }
 
 void
index e05a083..2be6983 100644 (file)
@@ -17,9 +17,9 @@
 #ifndef HEADER_SUPERTUX_GUI_MENU_MANAGER_HPP
 #define HEADER_SUPERTUX_GUI_MENU_MANAGER_HPP
 
-#include <vector>
 #include <list>
 #include <memory>
+#include <vector>
 
 #include "SDL.h"
 
@@ -37,6 +37,9 @@ public:
 
 private:
   std::unique_ptr<Dialog> m_dialog;
+  bool m_has_next_dialog;
+  std::unique_ptr<Dialog> m_next_dialog;
+
   std::vector<std::unique_ptr<Menu> > m_menu_stack;
   std::unique_ptr<MenuTransition> m_transition;