CMultiDocTemplate objects not being deleted
Kevin McConnell -- kevin@tigger.demon.co.uk Thursday, June 13, 1996 Platform: VC++ 4.0 / Win 95 I have a MDI app which has 3 document types, and so has three calls to = AddDocTemplate in InitInstance. Of these three, two use the same = document type which does not do any processing (it's all done in the = views). My problem is that I have detected memory leaks where the three = CMultiDocTemplate objects are not being deleted when the app exits. I = can't delete them myself since the framework then tries to delete them = in the CWinApp destructor (which would have suggested they would have = been deleted?). Can anyone shed any light on what's going on? I have MSDN. The code to add the doc templates is: m_pOutBoxTemplate =3D new CMultiDocTemplate( IDR_DB1TYPE, RUNTIME_CLASS(CDb1Doc), RUNTIME_CLASS(CMyChildWnd), =20 RUNTIME_CLASS(COutBoxView)); AddDocTemplate(m_pOutBoxTemplate); m_pInBoxTemplate =3D new CMultiDocTemplate( IDR_DB1TYPE, RUNTIME_CLASS(CDb1Doc), RUNTIME_CLASS(CInBoxWnd), =20 RUNTIME_CLASS(CInBoxView)); AddDocTemplate(m_pInBoxTemplate); m_pPreviewTemplate =3D new CMultiDocTemplate( IDR_PRVTYPE, RUNTIME_CLASS(CPreviewerDoc), RUNTIME_CLASS(CMDIChildWnd), =20 RUNTIME_CLASS(CPreviewerView)); AddDocTemplate(m_pPreviewTemplate); The pointers are protected member variables of the CWinApp derived = class, in order that I can refer to them to open new documents in the = app. Kevin McConnell.
Shiva Shenoy -- shiva@netbuild.com Friday, June 14, 1996 It was not clear if you tried to delete the doc templates in ExitInstance() or not. I ran into the same problem long time back and the following code solved it. if (m_pOutBoxTemplate) delete m_pOutBoxTemplate; likewise for the rest of the template pointers.... -Shiva shiva@netbuild.com >---------- >From: Kevin McConnell[SMTP:kevin@tigger.demon.co.uk] >Sent: Thursday, June 13, 1996 5:29 AM >To: 'mfc-l@netcom.com' >Subject: CMultiDocTemplate objects not being deleted > > >Platform: VC++ 4.0 / Win 95 > >I have a MDI app which has 3 document types, and so has three calls to >= >AddDocTemplate in InitInstance. Of these three, two use the same = >document type which does not do any processing (it's all done in the = >views). > >My problem is that I have detected memory leaks where the three = >CMultiDocTemplate objects are not being deleted when the app exits. I >= >can't delete them myself since the framework then tries to delete them >= >in the CWinApp destructor (which would have suggested they would have = >been deleted?). > >Can anyone shed any light on what's going on? I have MSDN. > >The code to add the doc templates is: > m_pOutBoxTemplate =3D new CMultiDocTemplate( > IDR_DB1TYPE, > RUNTIME_CLASS(CDb1Doc), > RUNTIME_CLASS(CMyChildWnd), =20 > RUNTIME_CLASS(COutBoxView)); > AddDocTemplate(m_pOutBoxTemplate); > > m_pInBoxTemplate =3D new CMultiDocTemplate( > IDR_DB1TYPE, > RUNTIME_CLASS(CDb1Doc), > RUNTIME_CLASS(CInBoxWnd), =20 > RUNTIME_CLASS(CInBoxView)); > AddDocTemplate(m_pInBoxTemplate); > > m_pPreviewTemplate =3D new CMultiDocTemplate( > IDR_PRVTYPE, > RUNTIME_CLASS(CPreviewerDoc), > RUNTIME_CLASS(CMDIChildWnd), =20 > RUNTIME_CLASS(CPreviewerView)); > AddDocTemplate(m_pPreviewTemplate); > >The pointers are protected member variables of the CWinApp derived = >class, in order that I can refer to them to open new documents in the = >app. > > Kevin McConnell. >
Niels Ull Jacobsen -- nuj@kruger.dk Wednesday, June 19, 1996 [Mini-digest: 2 responses] At 12:29 13-06-96 +-100, you wrote: > >Platform: VC++ 4.0 / Win 95 > >I have a MDI app which has 3 document types, and so has three calls to =3D >AddDocTemplate in InitInstance. Of these three, two use the same =3D >document type which does not do any processing (it's all done in the =3D >views). > >My problem is that I have detected memory leaks where the three =3D >CMultiDocTemplate objects are not being deleted when the app exits. I =3D >can't delete them myself since the framework then tries to delete them =3D >in the CWinApp destructor (which would have suggested they would have =3D >been deleted?). > >Can anyone shed any light on what's going on? I have MSDN. I don't have any specific solutions, but note that a template will only b= e deleted=20 in ~CWinApp (actually in ~CDocManager), if the m_bAutoDelete member is tr= ue. The=20 interaction of CWinApp, CDocManager, and CDocTemplate is sometimes a litt= le unclear,=20 but something which *may* affect you is if you forget to call CWinApp::InitInstance=20 from your overridden InitInstance. Also note that the document templates won't be deleted until ~CWinApp - a= nd as the application is (normally) a static, they won't be deleted until th= e statics=20 are destroyed. This happens *after* you application terminates, so be sur= e not to=20 "count" memory leaks until then. CMemoryState can't be used. Finally, if you can't solve the problem, don't let it spoil your sleep. Some people won't even think this qualifies as a true memory leak, as the= =20 objects are allocated only once at the start of the application, lives thorughout the application and all memory used by the application will automatically= be freed=20 upon termination anyway.=20 > Kevin McConnell. Niels Ull Jacobsen, Kr=FCger A/S (nuj@kruger.dk) Everything stated herein is THE OFFICIAL POLICY of the entire Kruger=20 group and should be taken as legally binding in every respect.=20 Pigs will grow wings and fly. -----From: "Dan Opperman"Is it possible that your setting CMultiDocTemplate ::m_bAutoDelete to false? Doing so would cause the behavior you described. The following code is from msdev\mfc\src\appui2.cpp: CDocManager::~CDocManager() { // for cleanup - delete all document templates POSITION pos = m_templateList.GetHeadPosition(); while (pos != NULL) { POSITION posTemplate = pos; CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos); // if you deleted it yourself, the next few lines would do something strange if (pTemplate->m_bAutoDelete) { m_templateList.RemoveAt(posTemplate); delete (CDocTemplate*)pTemplate; } } } Hope this helps, Daniel Opperman
| Вернуться в корень Архива |