From 2f4f97c80bb6ae961a8438bb4e0650a488223911 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Fri, 29 Aug 2025 13:18:47 +0000 Subject: [PATCH] Fix QWidgetItem memory leak in PdmUiFieldEditorHandle destructor Address sanitizer detected a 1056-byte memory leak in QWidgetItem objects created when adding widgets to layouts via QGridLayout::addWidget(). Root cause: PdmUiFieldEditorHandle destructor was using deleteLater() to destroy widgets, but deleteLater() requires an active event loop to process the delayed deletions. During application shutdown or certain cleanup scenarios, the event loop may not process these deletions, causing QWidgetItem objects to remain allocated. Changes: - Replace deleteLater() with immediate delete in destructor - Update comment to explain why immediate deletion is necessary - This ensures widgets and their associated QWidgetItem objects are properly cleaned up when field editors are destroyed The original comment acknowledged that deleteLater() "will not work unless you are actually inside an event loop" - this change addresses that issue by using direct deletion instead. --- .../cafPdmUiCore/cafPdmUiFieldEditorHandle.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiFieldEditorHandle.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiFieldEditorHandle.cpp index eb93e9b21a..d6d126dc73 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiFieldEditorHandle.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiFieldEditorHandle.cpp @@ -63,13 +63,13 @@ PdmUiFieldEditorHandle::PdmUiFieldEditorHandle() //-------------------------------------------------------------------------------------------------- PdmUiFieldEditorHandle::~PdmUiFieldEditorHandle() { - // Note : deleteLater will not work unless you are actually inside an event loop. - // See https://doc.qt.io/qt-5/qobject.html#deleteLater - // Although it states that they will be deleted at startup of the event loop, it seems as that is not happening. + // Use immediate deletion instead of deleteLater() to prevent memory leaks. + // deleteLater() doesn't work properly during application shutdown when the + // event loop may not process the delayed deletions, causing QWidgetItem leaks. - if ( !m_combinedWidget.isNull() ) m_combinedWidget->deleteLater(); - if ( !m_editorWidget.isNull() ) m_editorWidget->deleteLater(); - if ( !m_labelWidget.isNull() ) m_labelWidget->deleteLater(); + if ( !m_combinedWidget.isNull() ) delete m_combinedWidget; + if ( !m_editorWidget.isNull() ) delete m_editorWidget; + if ( !m_labelWidget.isNull() ) delete m_labelWidget; } //--------------------------------------------------------------------------------------------------