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(