From 4f3b8447531ad6fdf018391bbfb4b5f1625e8ce6 Mon Sep 17 00:00:00 2001 From: justburner Date: Sat, 16 Jul 2022 13:32:00 +0100 Subject: [PATCH] Fix memory corruption caused by rapid project/scene change --- toonz/sources/toonzlib/tscenehandle.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/toonz/sources/toonzlib/tscenehandle.cpp b/toonz/sources/toonzlib/tscenehandle.cpp index 3606dfe4..5bd94169 100644 --- a/toonz/sources/toonzlib/tscenehandle.cpp +++ b/toonz/sources/toonzlib/tscenehandle.cpp @@ -1,4 +1,4 @@ - +#include #include "toonz/tscenehandle.h" @@ -24,7 +24,22 @@ ToonzScene *TSceneHandle::getScene() const { return m_scene; } void TSceneHandle::setScene(ToonzScene *scene) { if (m_scene == scene) return; emit sceneSwitching(); - delete m_scene; + ToonzScene *oldscene = m_scene; m_scene = scene; if (m_scene) emit sceneSwitched(); + + // Prevent memory corruption caused by delayed signals writing into the + // discarded old scene while that memory was freed. + // That made OT had a chance of crashing when project or scene changed rapidly. + // Note: This is not the best solution but "it just works" + if (oldscene) { + QTimer *delayedTimer = new QTimer(this); + delayedTimer->setSingleShot(true); + + connect(delayedTimer, &QTimer::timeout, [=]() { + delete oldscene; + delayedTimer->deleteLater(); + }); + delayedTimer->start(3000); // 1 sec was enough, but... dunno about toasters + } }