Lars Gullik Bj�nnes wrote:

> Since we are almost tempted to use exceptions...
> 
> This is aimed at fixing memory leaks in the case of exceptions...
> (probably not all good, neither does it fix all problems...)

Given that renderer_ is stored as a scoped_ptr<RenderBase> already, 
this code seems ugly, ugly, ugly. Perhaps it would be better to store 
the thing in a shared_ptr<RenderBase>? 

Question: given that RenderGraphic derives from RenderBase, would code 
like this work:
        boost::shared_ptr<RenderGraphic> graphic_ptr(new RenderGraphic);
        renderer_ = graphic_ptr;
        graphic_ptr->connect(boost::bind(&InsetExternal::statusChanged,
                             this));

Ie, does 'shared_ptr<BaseClass> = shared_ptr<DerivedClass>' work?

Angus
                        

Index: src/insets/insetexternal.C
===================================================================
RCS file: 
/usr/local/lyx/cvsroot/lyx-devel/src/insets/insetexternal.C,v
retrieving revision 1.128
diff -u -p -r1.128 insetexternal.C
--- src/insets/insetexternal.C  1 Nov 2003 15:45:15 -0000       1.128
+++ src/insets/insetexternal.C  2 Nov 2003 22:24:08 -0000
@@ -580,7 +580,8 @@ void InsetExternal::setParams(InsetExter
        case RENDERBUTTON: {
                RenderButton * button_ptr = renderer_->asButton();
                if (!button_ptr) {
-                       button_ptr = new RenderButton;
+                       auto_ptr<RenderButton> rb(new RenderButton);
+                       button_ptr = rb.release();
                        renderer_.reset(button_ptr);
                }

@@ -590,7 +591,8 @@ void InsetExternal::setParams(InsetExter
        } case RENDERGRAPHIC: {
                RenderGraphic * graphic_ptr = renderer_->asGraphic();
                if (!graphic_ptr) {
-                       graphic_ptr = new RenderGraphic;
+                       auto_ptr<RenderGraphic> rg(new RenderGraphic);
+                       graphic_ptr = rg.release();
                        graphic_ptr->connect(
                                boost::bind(&InsetExternal::statusChanged, this));
                        renderer_.reset(graphic_ptr);
@@ -604,7 +606,9 @@ void InsetExternal::setParams(InsetExter
                RenderMonitoredPreview * preview_ptr =
                        renderer_->asMonitoredPreview();
                if (!preview_ptr) {
-                       preview_ptr  = new RenderMonitoredPreview;
+                       auto_ptr<RenderMonitoredPreview>
+                               rmp(new RenderMonitoredPreview);
+                       preview_ptr = rmp.release();
                        preview_ptr->connect(
                                boost::bind(&InsetExternal::statusChanged, this));
                        preview_ptr->fileChanged(


Reply via email to