]> git.saurik.com Git - wxWidgets.git/commitdiff
don't leak memory if exceptions are thrown during a new wxDocument creation
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 9 Mar 2009 18:45:35 +0000 (18:45 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 9 Mar 2009 18:45:35 +0000 (18:45 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59452 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/docview.cpp

index db24f276be2ae5242f04a3d6ddf20571885218e3..82c2720201b1fe0377d12d6399fd156b5ee6f5ca 100644 (file)
@@ -774,12 +774,9 @@ wxDocTemplate::~wxDocTemplate()
 // Tries to dynamically construct an object of the right class.
 wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags)
 {
 // Tries to dynamically construct an object of the right class.
 wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags)
 {
-    wxDocument * const doc = DoCreateDocument();
+    wxScopedPtr<wxDocument> doc(DoCreateDocument());
 
 
-    // VZ: this code doesn't delete doc if InitDocument() (i.e. doc->OnCreate())
-    //     fails, is this intentional?
-
-    return doc && InitDocument(doc, path, flags) ? doc : NULL;
+    return doc && InitDocument(doc.get(), path, flags) ? doc.release() : NULL;
 }
 
 bool
 }
 
 bool
@@ -1307,15 +1304,18 @@ wxDocument *wxDocManager::CreateDocument(const wxString& pathOrig, long flags)
     docNew->SetDocumentName(temp->GetDocumentName());
     docNew->SetDocumentTemplate(temp);
 
     docNew->SetDocumentName(temp->GetDocumentName());
     docNew->SetDocumentTemplate(temp);
 
-    // call the appropriate function depending on whether we're creating a new
-    // file or opening an existing one
-    if ( !(flags & wxDOC_NEW ? docNew->OnNewDocument()
-                             : docNew->OnOpenDocument(path)) )
+    wxTRY
     {
     {
-         // Document is implicitly deleted by DeleteAllViews
-         docNew->DeleteAllViews();
-         return NULL;
+        // call the appropriate function depending on whether we're creating a
+        // new file or opening an existing one
+        if ( !(flags & wxDOC_NEW ? docNew->OnNewDocument()
+                                 : docNew->OnOpenDocument(path)) )
+        {
+            docNew->DeleteAllViews();
+            return NULL;
+        }
     }
     }
+    wxCATCH_ALL( docNew->DeleteAllViews(); throw; )
 
     // add the successfully opened file to MRU, but only if we're going to be
     // able to reopen it successfully later which requires the template for
 
     // add the successfully opened file to MRU, but only if we're going to be
     // able to reopen it successfully later which requires the template for