From: Vadim Zeitlin Date: Mon, 7 Feb 2000 16:51:39 +0000 (+0000) Subject: trying to fix memory leak in wxListCtrl (attributes not deleted) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/6932a32c2b1072879a7be05dae5308f79fe4bd80?ds=inline trying to fix memory leak in wxListCtrl (attributes not deleted) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5889 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/listctrl.h b/include/wx/msw/listctrl.h index 47c81afaf4..106c857248 100644 --- a/include/wx/msw/listctrl.h +++ b/include/wx/msw/listctrl.h @@ -331,6 +331,9 @@ protected: // common part of all ctors void Init(); + // free memory taken by all attributes + void FreeAllAttrs(); + wxTextCtrl* m_textCtrl; // The control used for editing a label wxImageList * m_imageListNormal; // The image list for normal icons wxImageList * m_imageListSmall; // The image list for small icons diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 15d33a55c1..029cbe1b31 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -239,7 +239,7 @@ void wxListCtrl::UpdateStyle() } } -wxListCtrl::~wxListCtrl() +void wxListCtrl::FreeAllAttrs() { if ( m_hasAnyAttr ) { @@ -247,8 +247,15 @@ wxListCtrl::~wxListCtrl() { delete (wxListItemAttr *)node->Data(); } + + m_attrs.Destroy(); + + m_hasAnyAttr = FALSE; } +} +wxListCtrl::~wxListCtrl() +{ if ( m_textCtrl ) { m_textCtrl->UnsubclassWin(); @@ -1295,20 +1302,12 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) } case LVN_DELETEALLITEMS: - // What's the sense of generating a wxWin event for this when - // it's absolutely not portable? - // This is perfectly portable, RR -#if 1 - eventType = wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS; + eventType = wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS; event.m_itemIndex = -1; -#endif // 1 - // return TRUE to suppress all additional LVN_DELETEITEM - // notifications - this makes deleting all items from a list ctrl - // much faster - *result = TRUE; + FreeAllAttrs(); - break; + break; case LVN_DELETEITEM: { @@ -1579,19 +1578,19 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) if ( !GetEventHandler()->ProcessEvent(event) ) return FALSE; - if (eventType == wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS) - { - // No postprocessing, because we want *return to - // be TRUE so that no further DeleteItem events - // are sent, RR. - return TRUE; - } - // post processing // --------------- switch ( (int)nmhdr->code ) { + case LVN_DELETEALLITEMS: + // always return TRUE to suppress all additional LVN_DELETEITEM + // notifications - this makes deleting all items from a list ctrl + // much faster + *result = TRUE; + + return TRUE; + case LVN_GETDISPINFO: { LV_DISPINFO *info = (LV_DISPINFO *)lParam; @@ -1611,8 +1610,6 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) *result = event.IsAllowed(); return TRUE; } - default: - break; } *result = !event.IsAllowed();