Fix #32046: GHOST_DropTargetWin32 memory leak, patch by Matt D.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 3 Sep 2012 17:41:47 +0000 (17:41 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 3 Sep 2012 17:41:47 +0000 (17:41 +0000)
intern/ghost/intern/GHOST_DropTargetWin32.cpp
intern/ghost/intern/GHOST_WindowWin32.cpp

index 4142b19f21dfa65c06da26c3e71aa2dc0b675d85..89e9a91b34c7bf4a21185be421adddf9ac587bb0 100644 (file)
@@ -51,14 +51,10 @@ GHOST_DropTargetWin32::GHOST_DropTargetWin32(GHOST_WindowWin32 *window, GHOST_Sy
        m_cRef = 1;
        m_hWnd = window->getHWND();
        m_draggedObjectType = GHOST_kDragnDropTypeUnknown;
-       
-       // register our window as drop target
-       ::RegisterDragDrop(m_hWnd, this);
 }
 
 GHOST_DropTargetWin32::~GHOST_DropTargetWin32()
 {
-       ::RevokeDragDrop(m_hWnd);
 }
 
 
index 3a6e646de11bc99e2816a3cf5922eafceee5789b..71a9db349ee1e9c9b255f4b78ac024c06262a5ed 100644 (file)
@@ -271,6 +271,10 @@ GHOST_WindowWin32::GHOST_WindowWin32(
                // Register this window as a droptarget. Requires m_hWnd to be valid.
                // Note that OleInitialize(0) has to be called prior to this. Done in GHOST_SystemWin32.
                m_dropTarget = new GHOST_DropTargetWin32(this, m_system);
+               if (m_dropTarget) {
+                       ::RegisterDragDrop(m_hWnd, m_dropTarget);
+               }
+
                // Store a pointer to this class in the window structure
                ::SetWindowLongPtr(m_hWnd, GWL_USERDATA, (LONG_PTR) this);
 
@@ -415,7 +419,13 @@ GHOST_WindowWin32::~GHOST_WindowWin32()
                m_hDC = 0;
        }
        if (m_hWnd) {
-               m_dropTarget->Release(); // frees itself.
+               if (m_dropTarget) {
+                       // Disable DragDrop
+                       RevokeDragDrop(m_hWnd);
+                       // Release our reference of the DropTarget and it will delete itself eventually.
+                       m_dropTarget->Release();
+               }
+
                ::DestroyWindow(m_hWnd);
                m_hWnd = 0;
        }