Problem in the destructor of a class derived from CTreeView
Anujit Sarkar -- anujit@vedika.ernet.in Wednesday, July 03, 1996 Environment:Win95,MSVC 4.1 I have derived a class DerivedTreeView from CTreeView.I am inserting treeitems in which I am storing a pointer to a structure in lParam of TV_ITEM .The pointer is being allocated at runtime and should be freed to avoid memory leakage.So I tried to deallocate the storage in the destructor of DerivedTreeView.But unfortunately I found that the GetTreeCtrl() is not returning a valid TreeCtrl.It seems that the destructor of DerivedTreeView is being called after the destructor of CTreeView has been called.In other words the destructor of a derived class is being called after the invocation of the destructor of the base class.Is this a bug ? Bad implementation?How to get around the problem. Thanks in advance. ------------------------------------------------------------------- Anujit Sarkar(e-mail address:anujit@vedika.ernet.in) ------------------------------------------------------------------- Resi: 102 Southern Avenue Office:Vedika International 'Sarobar' 7 N.E. 21 Lansdowne Court Calcutta -700029 5B Sarat Bose Road INDIA Calcutta-700020 INDIA Phone No.+91-33-4661473 Phone No.+91-33-2473810 -------------------------------------------------------------------
Klaus Guetter -- 100031.1400@CompuServe.COM Monday, July 08, 1996 [Mini-digest: 6 responses] Anujit, Probably you should add a WM_DESTROY handler to your derived class and free the resources in this function. - Klaus -----From: "K.V.R.M.Rao"Windows' "tree control" attached to the CTreeView is already destroyed by the time destructor for the CTreeView is called. All the pointers for dynamically allocated memory assosiated with nodes are stored within the "tree control". You should free all the memory in the "OnDestroy" handler of CTreeView derived class. Rammohan Optima Software Services, #503, Maitrivanam, HUDA complex, Ameerpet, Hyderabad - 500 038 INDIA -----From: joew@statsoftinc.com (Joe Willcoxson) Create an OnDestroy handler, and clean up your memory there. However, be careful, since you must make sure that the Windows Window is destroyed before your C++ object. Otherwise, your message map to your OnDestroy handler will be deleted and won't ever get called. One way to do this is to call DestroyWindow in your DerivedTreeView destructor. Joe Willcoxson (joew@statsoftinc.com) http://www.statsoftinc.com http://users.aol.com/chinajoe -----From: Mark Koehler I have found that this sort of clean-up is usually best handled in response to the WM_DESTROY message for the appropriate window. In this case, it be in the class derived from CTreeView. Make certain you perform the cleanup before calling the inherited OnDestroy. You can't do this sort of cleanup in the destructor because the window handle is no longer valid. -- Mark Koehler Atlanta, GA -----From: Bharat Gogia In such cases you should always use OnClose() to free the resources associated with window -----From: Zafir Anjum The windows are destroyed much before the C++ object destructor is called. Override OnClose() and deallocate memory there. Zafir
Gordon Weakliem -- gweakl@metronet.com Wednesday, July 10, 1996 At 10:25 AM 7/3/96 IST, you wrote: >So I tried to deallocate the storage in the destructor of DerivedTreeView.But >unfortunately I found that the GetTreeCtrl() is not returning a valid >TreeCtrl.It seems that the destructor of DerivedTreeView is being called after >the destructor of CTreeView has been called.In other words the >destructor of a derived class is being called after the invocation >of the destructor of the base class.Is this a bug ? Bad >implementation?How to get around the problem. MFC CWnd derived classes create the window object in Create() and destroy it in OnDestroy(). You should override OnDestroy() to destroy things like image lists, etc. Gordon Weakliem gweakl@metronet.com
Gordon Weakliem -- gweakl@metronet.com Wednesday, July 10, 1996 At 10:25 AM 7/3/96 IST, you wrote: >So I tried to deallocate the storage in the destructor of DerivedTreeView.But >unfortunately I found that the GetTreeCtrl() is not returning a valid >TreeCtrl.It seems that the destructor of DerivedTreeView is being called after >the destructor of CTreeView has been called.In other words the >destructor of a derived class is being called after the invocation >of the destructor of the base class.Is this a bug ? Bad >implementation?How to get around the problem. MFC CWnd derived classes create the window object in Create() and destroy it in OnDestroy(). You should override OnDestroy() to destroy things like image lists, etc. Gordon Weakliem gweakl@metronet.com
| Вернуться в корень Архива |