找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1446|回复: 11

[求助]:情高手看看下面的程序

[复制链接]
发表于 2002-11-4 16:22:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
主要是画一段曲线。
当处理很多的时候,怎么会出现内存泄漏的问题,内存使用居高不下,最后就崩溃了
请问高手是那里的问题呢?很急的说!!!!!!!!!!!!!!!!!!

////////////////////////////////////////////////////////////////
//将经过切割后的圆柱体实行两次解析,根据得到的线画出相贯线并保存
//在一个以圆柱体的序号为名称的文件中,程序主要使用此函数画图
void drawCurveAndsave(AcDbObjectId CylId,AcDbBlockTableRecord* pBtblRcd)
{
        AcDb3dSolid *pBox;
        AcDbVoidPtrArray regionSet;

        acdbOpenObject(pBox, CylId, AcDb::kForRead);
        AcDbRegion *sectionRegion;

    pBox->getSection(XY_Plane,sectionRegion);
        pBox->explode(regionSet);
        pBox->close();

            for(int i = 0; i < regionSet.length(); i++)
        {
                AcDbEntity  *pReg= (AcDbEntity*)regionSet;
            
                AcDbVoidPtrArray lineSet;
                pReg->explode(lineSet);
                pReg->close();

                for(int j = 0; j < lineSet.length(); j++)
                {
           AcDbCurve  *pCurve= (AcDbCurve*)lineSet[j];
           //acutPrintf(_T("\nLine=%s"),pLine->isA()->name());
           

                   if (bNeededCurve(CylId,pCurve))
                   {
                           double Startpara,Endpara,R;
               AcGeVector3d Vector1;
               AcGePoint3d cenPoint;
               getCylinderProp(CylId,R,Vector1,cenPoint);
               pCurve->getStartParam(Startpara);
   
               pCurve->getEndParam(Endpara);
   
               AcDbObjectId LineId;
               LineId=seekCyl_lineId(CylId);

               double cita=Startpara;
               double step=0.2;
               double dis;
               double flag;
               AcGePoint3d sPoint,ePoint,tempPoint;
   

               while((cita>=Startpara)&&(cita<Endpara))
                           {
                      flag=1;
                      pCurve->getPointAtParam(cita,tempPoint) ;
                  sPoint[X]=Xstep+R* getPoint_XCoord(LineId,tempPoint,flag);
                      dis=cenPoint.distanceTo(tempPoint);
      
                      sPoint[Y]=flag*sqrt(abs(dis*dis-R*R));
                      sPoint[Z]=0;
          

                      cita=cita+step;
      
                      flag=1;
                      pCurve->getPointAtParam(cita,tempPoint) ;
                      ePoint[X]=Xstep+R* getPoint_XCoord(LineId,tempPoint,flag);
                      dis=cenPoint.distanceTo(tempPoint);
      
                      ePoint[Y]=flag*sqrt(abs(dis*dis-R*R));
                      ePoint[Z]=0;

                                  AcDbLine *pLine = new AcDbLine(sPoint, ePoint);
                      pBtblRcd->appendAcDbEntity(pLine);
                  pLine->close();
                      
                           }

           }
                   pCurve->close();
                }
        }//end loop i

}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2002-11-4 16:30:21 | 显示全部楼层
下面是调用该程序的过程:

void getCylCurve(int Filenumber)
{
   
        ////////////////////////////////////////////////////
        //建立新的数据库,将曲线保存到文件中
                AcDbDatabase *pDb = new AcDbDatabase();
  
        AcDbBlockTable *pBtbl;
        pDb->getSymbolTable(pBtbl, AcDb::kForRead);

        AcDbBlockTableRecord *pBtblRcd;
        pBtbl->getAt(ACDB_MODEL_SPACE, pBtblRcd,AcDb::kForWrite);
        pBtbl->close();

                AcDbObjectId slaveLineId=allslaveCylArray[Filenumber].lineId;
        AcDbLine *pLine;

                acdbOpenObject(pLine,slaveLineId,AcDb::kForRead);
            AcGePoint3d startPt = pLine->startPoint();
            AcGePoint3d endPt   = pLine->endPoint();
                pLine->close();
       
            char dimText1[20] ;
                char dimText2[20] ;
                int startPosition=getNodePosition(startPt);
                int endPosition=getNodePosition(endPt);
            sprintf(dimText1,"Node%d",startPosition);
                sprintf(dimText2,"Node%d",endPosition);

        AcGePoint3d dimPoint1=AcGePoint3d(100,-300,0);
                AcGePoint3d dimPoint2=AcGePoint3d(100,300,0);
                AcDbText *pText1=new AcDbText(dimPoint1,dimText1,AcDbObjectId::kNull,25,0);
                AcDbText *pText2=new AcDbText(dimPoint2,dimText2,AcDbObjectId::kNull,25,0);
        pBtblRcd->appendAcDbEntity(pText1);
                pBtblRcd->appendAcDbEntity(pText2);
                pText1->close();
                pText2->close();

                dimALine(slaveLineId,0,Filenumber);
        createNewXYZ_Axis(slaveLineId);
        drawCurveAndsave(allslaveCylArray[Filenumber].CylId,pBtblRcd);
                
        pBtblRcd->close();
        // AcDbDatabase::saveAs() does NOT automatically
        // append a DWG file extension, so it
        // must be specified.
        
            char Filename[20] ;
            sprintf(Filename,"圆柱%d.dwg",Filenumber);
        pDb->saveAs(Filename);
                delete pDb;
        
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-4 17:10:20 | 显示全部楼层
你用到了REGION,3DSOLID实体,我想问题应该是ACAD 在对3DSOLID实体内存管理上需要特别注意的,这个问题以前讨论过,我给大家写过解决办法。

你看看下面的帖子:

http://www.xdcad.net/forum/showthread.php?postid=38738#post38738

如果解决问题了,来论坛回复这个帖子告诉大家一声。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-4 18:27:17 | 显示全部楼层
不是那种问题,因为我前面有3dSolid处理的,用了上面帖子上的函数

我调试过程序,导致内存泄漏的是与3DSOLID无关的。所以我也不知道是怎么回事。
XD,会不会是因为有的对象没有关掉或删除掉导致占用的内存不能释放?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-4 18:31:44 | 显示全部楼层

Re: [求助]:情高手看看下面的程序

最初由 zhouyf 发布
[B]主要是画一段曲线。
当处理很多的时候,怎么会出现内存泄漏的问题,内存使用居高不下,最后就崩溃了
请问高手是那里的问题呢?很急的说!!!!!!!!!!!!!!!!!!

////////////////////////////////... [/B]

原因:
This also means that if an ObjectARX application calls the explode method of an object, the calling application is responsible for the resulting entities (that is, either appending them to a database or deleting them when they are no longer needed) and for erasing the original entity (if appropriate).
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-4 19:45:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
哦,是这样啊。
那么是使用delete操作就可以了吗?还是需要其他的操作呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-11-5 00:29:28 | 显示全部楼层
最初由 zhouyf 发布
[B]哦,是这样啊。
那么是使用delete操作就可以了吗?还是需要其他的操作呢? [/B]


仅需要delete
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-5 09:43:05 | 显示全部楼层
我对explode后得到的pCurve进行了delete操作,调试的过程中的确可以看到有内存下降的一会
,但是总体还是一直上涨,还有其他需要改进的地方吗?请斑竹指点一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-5 09:49:27 | 显示全部楼层
但是将acad。exe进程杀掉后,内存使用又恢复了正常,
以前是杀掉后还是居高不下,这又是什么原因呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-5 14:52:29 | 显示全部楼层
问题基本搞定了,斑竹说的对,主要是没有delete一些中间变量指针。delete之后
,内存占用上涨不是很快,而且中途由于释放了指针可以明显看到内存的下降。
多谢各位大虾
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-5 14:55:26 | 显示全部楼层
最初由 zhouyf 发布
[B]问题基本搞定了,斑竹说的对,主要是没有delete一些中间变量指针。delete之后
,内存占用上涨不是很快,而且中途由于释放了指针可以明显看到内存的下降。
多谢各位大虾 [/B]


把解决后的完整代码给大家贴下吧,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-5 15:06:59 | 显示全部楼层
问题基本搞定了,斑竹说的对,主要是没有delete一些中间变量指针。delete之后
,内存占用上涨不是很快,而且中途由于释放了指针可以明显看到内存的下降。
多谢各位大虾
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 11:05 , Processed in 0.419894 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表