From 315a9460c00c60628e9803502c1641a9de35dbac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C4=83t=C4=83lin=20R=C4=83ceanu?= Date: Wed, 27 Feb 2019 01:12:03 +0200 Subject: [PATCH] Remove memory leaks by using smart pointers or explicit delete --- include/wx/qt/window.h | 16 +++++++------ src/qt/window.cpp | 51 +++++++++++++++--------------------------- 2 files changed, 27 insertions(+), 40 deletions(-) diff --git a/include/wx/qt/window.h b/include/wx/qt/window.h index e9d14424bf..7951ed5436 100644 --- a/include/wx/qt/window.h +++ b/include/wx/qt/window.h @@ -9,6 +9,8 @@ #ifndef _WX_QT_WINDOW_H_ #define _WX_QT_WINDOW_H_ +#include + class QShortcut; template < class T > class QList; @@ -216,24 +218,24 @@ protected: private: void Init(); - QScrollArea *m_qtContainer; + QScrollArea *m_qtContainer; // either NULL or the same as m_qtWindow pointer - QScrollBar *m_horzScrollBar; - QScrollBar *m_vertScrollBar; + QScrollBar *m_horzScrollBar; // owned by m_qtWindow when allocated + QScrollBar *m_vertScrollBar; // owned by m_qtWindow when allocated QScrollBar *QtGetScrollBar( int orientation ) const; QScrollBar *QtSetScrollBar( int orientation, QScrollBar *scrollBar=NULL ); bool QtSetBackgroundStyle(); - QPicture *m_qtPicture; - QPainter *m_qtPainter; + QPicture *m_qtPicture; // not owned + QScopedPointer m_qtPainter; // always allocated bool m_mouseInside; #if wxUSE_ACCEL - QList< QShortcut* > *m_qtShortcuts; - wxQtShortcutHandler *m_qtShortcutHandler; + QScopedPointer< QList > m_qtShortcuts; // always allocated + QScopedPointer m_qtShortcutHandler; // always allocated bool m_processingShortcut; #endif // wxUSE_ACCEL diff --git a/src/qt/window.cpp b/src/qt/window.cpp index 2e8094f1c2..07bff82592 100644 --- a/src/qt/window.cpp +++ b/src/qt/window.cpp @@ -211,14 +211,13 @@ void wxWindowQt::Init() m_vertScrollBar = NULL; m_qtPicture = NULL; - m_qtPainter = new QPainter(); + m_qtPainter.reset(new QPainter()); m_mouseInside = false; #if wxUSE_ACCEL - m_qtShortcutHandler = new wxQtShortcutHandler( this ); + m_qtShortcutHandler.reset(new wxQtShortcutHandler(this)); m_processingShortcut = false; - m_qtShortcuts = NULL; #endif m_qtWindow = NULL; m_qtContainer = NULL; @@ -251,11 +250,14 @@ wxWindowQt::~wxWindowQt() DestroyChildren(); // This also destroys scrollbars - delete m_qtPainter; - #if wxUSE_ACCEL - m_qtShortcutHandler->deleteLater(); - delete m_qtShortcuts; + if ( m_qtShortcuts ) + { + for ( int i = 0; i < m_qtShortcuts->size(); ++i ) + { + delete m_qtShortcuts->at(i); + } + } #endif #if wxUSE_DRAG_AND_DROP @@ -266,23 +268,8 @@ wxWindowQt::~wxWindowQt() if (m_qtWindow) { wxLogTrace(TRACE_QT_WINDOW, wxT("wxWindow::~wxWindow %s m_qtWindow=%p"), GetName(), m_qtWindow); - // Avoid sending further signals (i.e. if deleting the current page) - m_qtWindow->blockSignals(true); - // Reset the pointer to avoid handling pending event and signals - QtStoreWindowPointer( GetHandle(), NULL ); - if ( m_horzScrollBar ) - { - QtStoreWindowPointer( m_horzScrollBar, NULL ); - m_horzScrollBar->deleteLater(); - } - if ( m_vertScrollBar ) - { - QtStoreWindowPointer( m_vertScrollBar, NULL ); - m_vertScrollBar->deleteLater(); - } - // Delete QWidget when control return to event loop (safer) - m_qtWindow->deleteLater(); - m_qtWindow = NULL; + + delete m_qtWindow; } else { @@ -622,6 +609,8 @@ QScrollBar *wxWindowQt::QtSetScrollBar( int orientation, QScrollBar *scrollBar ) void wxWindowQt::SetScrollbar( int orientation, int pos, int thumbvisible, int range, bool WXUNUSED(refresh) ) { + wxCHECK_RET(GetHandle(), "Window has not been created"); + //If not exist, create the scrollbar QScrollBar *scrollBar = QtGetScrollBar( orientation ); if ( scrollBar == NULL ) @@ -1013,19 +1002,15 @@ void wxWindowQt::SetAcceleratorTable( const wxAcceleratorTable& accel ) // Disable previously set accelerators while ( !m_qtShortcuts->isEmpty() ) delete m_qtShortcuts->takeFirst(); - - // Create new shortcuts (use GetHandle() so all events inside - // the window are handled, not only in the container subwindow) - delete m_qtShortcuts; } - m_qtShortcuts = accel.ConvertShortcutTable( GetHandle() ); + m_qtShortcuts.reset(accel.ConvertShortcutTable(GetHandle())); // Connect shortcuts to window Q_FOREACH( QShortcut *s, *m_qtShortcuts ) { - QObject::connect( s, &QShortcut::activated, m_qtShortcutHandler, &wxQtShortcutHandler::activated ); - QObject::connect( s, &QShortcut::activatedAmbiguously, m_qtShortcutHandler, &wxQtShortcutHandler::activated ); + QObject::connect( s, &QShortcut::activated, m_qtShortcutHandler.get(), &wxQtShortcutHandler::activated ); + QObject::connect( s, &QShortcut::activatedAmbiguously, m_qtShortcutHandler.get(), &wxQtShortcutHandler::activated ); } } #endif // wxUSE_ACCEL @@ -1191,7 +1176,7 @@ bool wxWindowQt::QtHandlePaintEvent ( QWidget *handler, QPaintEvent *event ) else { // Data from wxClientDC, paint it - m_qtPicture->play( m_qtPainter ); + m_qtPicture->play( m_qtPainter.get() ); // Reset picture m_qtPicture->setData( NULL, 0 ); handled = true; @@ -1572,5 +1557,5 @@ void wxWindowQt::QtSetPicture( QPicture* pict ) QPainter *wxWindowQt::QtGetPainter() { - return m_qtPainter; + return m_qtPainter.get(); }