From 69b9943d949a12746711feb490261eed7675e4a8 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 27 Jan 2012 14:49:02 +0100 Subject: [PATCH] Windows: Fix exit crash related to deletion of platform screens. Do not delete screens in the destructor as this might call back to the Windows and use QWindowsContext. Change-Id: I5e66e480d4b6ddb8b17cc92e4bef93013e336be6 Reviewed-by: Friedemann Kleint --- src/plugins/platforms/windows/qwindowscontext.cpp | 1 + src/plugins/platforms/windows/qwindowsscreen.cpp | 5 ----- src/plugins/platforms/windows/qwindowsscreen.h | 3 ++- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index cd11d82d2d..e7bb997da9 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -291,6 +291,7 @@ QWindowsContext::~QWindowsContext() if (d->m_oleInitializeResult == S_OK || d->m_oleInitializeResult == S_FALSE) OleUninitialize(); + d->m_screenManager.clearScreens(); // Order: Potentially calls back to the windows. m_instance = 0; } diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp index b2c85247f6..dccd582473 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.cpp +++ b/src/plugins/platforms/windows/qwindowsscreen.cpp @@ -304,11 +304,6 @@ QWindowsScreenManager::QWindowsScreenManager() : { } -QWindowsScreenManager::~QWindowsScreenManager() -{ - qDeleteAll(m_screens); -} - /*! \brief Triggers synchronization of screens (WM_DISPLAYCHANGE). diff --git a/src/plugins/platforms/windows/qwindowsscreen.h b/src/plugins/platforms/windows/qwindowsscreen.h index 7edf2ad0f5..c2cf0b4523 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.h +++ b/src/plugins/platforms/windows/qwindowsscreen.h @@ -114,7 +114,8 @@ public: typedef QList WindowsScreenList; QWindowsScreenManager(); - ~QWindowsScreenManager(); + + inline void clearScreens() { qDeleteAll(m_screens); m_screens.clear(); } void handleScreenChanges(); bool handleDisplayChange(WPARAM wParam, LPARAM lParam);