There seems to be a solution that can make the code a little bit
cleaner and easier to maintain.
#define DECLARE_PTR_AUTO_DELETOR(CLASS, VAR_PTR)\
boost::scoped_ptr<CLASS> auto__deletor__for__ ## VAR_PTR (VAR_PTR)
AcDbCircle *pFace =new AcDbCircle (AcGePoint3d::kOrigin, AcGeVector3d::kZAxis, 1.0) ;
AcDbCircle *pLeftEye =new AcDbCircle (AcGePoint3d (0.33, 0.25, 0.0), AcGeVector3d::kZAxis, 0.1) ;
AcDbCircle *pRightEye =new AcDbCircle (AcGePoint3d (-0.33, 0.25, 0.0), AcGeVector3d::kZAxis, 0.1) ;
AcDbArc *pMouth =new AcDbArc (AcGePoint3d (0, 0.5, 0), 1.0, 3.141592 + (3.141592 * 0.3), 3.141592 + (3.141592 * 0.7)) ;
DECLARE_PTR_AUTO_DELETOR(AcDbCircle, pFace);
DECLARE_PTR_AUTO_DELETOR(AcDbCirclep, LeftEye);
DECLARE_PTR_AUTO_DELETOR(AcDbCircle, pRightEye);
DECLARE_PTR_AUTO_DELETOR(AcDbArc, pMouth);
// Set the color property.
pFace->setColorIndex (2) ;
pLeftEye->setColorIndex (5) ;
pRightEye->setColorIndex (5) ;
pMouth->setColorIndex (1) ;
// add the entities to the new block table record
if ( (es =pBlockTableRecord->appendAcDbEntity (pFace)) != Acad::eOk ) {
//delete pFace ; // all these 'delete ...' not needed any more ...
//delete pLeftEye ;
//delete pRightEye ;
//delete pMouth ;
pBlockTableRecord->erase () ;
pBlockTableRecord->close () ;
return (es) ;
}
pFace->close () ;
if ( (es =pBlockTableRecord->appendAcDbEntity (pLeftEye)) != Acad::eOk ) {
//delete pLeftEye ;
//delete pRightEye ;
//delete pMouth ;
pBlockTableRecord->erase () ;
pBlockTableRecord->close () ;
return (es) ;
}
pLeftEye->close () ;
if ( (es =pBlockTableRecord->appendAcDbEntity (pRightEye)) != Acad::eOk ) {
//delete pRightEye ;
//delete pMouth ;
pBlockTableRecord->erase () ;
pBlockTableRecord->close () ;
return (es) ;
}
pRightEye->close () ;
if ( (es =pBlockTableRecord->appendAcDbEntity (pMouth)) != Acad::eOk ) {
//delete pMouth ;
pBlockTableRecord->erase () ;
pBlockTableRecord->close () ;
return (es) ;
}
pMouth->close () ;
Thanks you all that hepled.
B/Rgds
Max
----- Original Message -----
From: Max
To: Emil Dotchevski
Subject: Re: [Boost-users] [shared_ptr] Is it possible for a shared_ptr to
Date: 2008-12-26 09:22:00
Hello Dotchevski,
Thanks for your explanation.
This question was pushed to me by seeing the following code
in an Autodesk AutoCAD ObjectARX sample program.
Don't pay much attention to the descrete classes, just to the
new/delete operations. I found the if/delete guards to prevent
memory leakage too tedious.
I hope there's a smart_ptr-like technique that could help me
circumvent this verbose coding style.
In other words, my need could be described as:
1) allocate objects dynamically on heap,
2) send them to algorithms that are prone to failure
3) if the opreation succeeds, the objects will be taken care of
by the receiver of these objects, or, otherwise, they will
be automatically freed without having to delete these objects
manually.
AcDbCircle *pFace =new AcDbCircle (AcGePoint3d::kOrigin, AcGeVector3d::kZAxis, 1.0) ;
AcDbCircle *pLeftEye =new AcDbCircle (AcGePoint3d (0.33, 0.25, 0.0), AcGeVector3d::kZAxis, 0.1) ;
AcDbCircle *pRightEye =new AcDbCircle (AcGePoint3d (-0.33, 0.25, 0.0), AcGeVector3d::kZAxis, 0.1) ;
AcDbArc *pMouth =new AcDbArc (AcGePoint3d (0, 0.5, 0), 1.0, 3.141592 + (3.141592 * 0.3), 3.141592 + (3.141592 * 0.7)) ;
// Set the color property.
pFace->setColorIndex (2) ;
pLeftEye->setColorIndex (5) ;
pRightEye->setColorIndex (5) ;
pMouth->setColorIndex (1) ;
// add the entities to the new block table record
if ( (es =pBlockTableRecord->appendAcDbEntity (pFace)) != Acad::eOk ) {
delete pFace ;
delete pLeftEye ;
delete pRightEye ;
delete pMouth ;
pBlockTableRecord->erase () ;
pBlockTableRecord->close () ;
return (es) ;
}
pFace->close () ;
if ( (es =pBlockTableRecord->appendAcDbEntity (pLeftEye)) != Acad::eOk ) {
delete pLeftEye ;
delete pRightEye ;
delete pMouth ;
pBlockTableRecord->erase () ;
pBlockTableRecord->close () ;
return (es) ;
}
pLeftEye->close () ;
if ( (es =pBlockTableRecord->appendAcDbEntity (pRightEye)) != Acad::eOk ) {
delete pRightEye ;
delete pMouth ;
pBlockTableRecord->erase () ;
pBlockTableRecord->close () ;
return (es) ;
}
pRightEye->close () ;
if ( (es =pBlockTableRecord->appendAcDbEntity (pMouth)) != Acad::eOk ) {
delete pMouth ;
pBlockTableRecord->erase () ;
pBlockTableRecord->close () ;
return (es) ;
}
pMouth->close () ;
Thanks for your patience!
Best regards
Max
-------------------------------------------------------------------
新浪空间——与朋友开心分享网络新生活!(http://space.sina.com.cn/ )