diff --git a/toonz/sources/toonzlib/tscenehandle.cpp b/toonz/sources/toonzlib/tscenehandle.cpp index 9626707..5f009d8 100644 --- a/toonz/sources/toonzlib/tscenehandle.cpp +++ b/toonz/sources/toonzlib/tscenehandle.cpp @@ -1,4 +1,4 @@ - +#include #include "toonz/tscenehandle.h" @@ -23,7 +23,22 @@ ToonzScene *TSceneHandle::getScene() const { return m_scene; } void TSceneHandle::setScene(ToonzScene *scene) { if (m_scene == scene) return; - 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 + } }