找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 738|回复: 12

[求助]:内存泄漏?

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

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

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

×
我写的ARX编译是通过的,也可以正确的执行,可是为什么执行了以后,再执行其他操作的时候auto CAD就死了呢?是因为哪里内存泄露了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-12-22 19:31:38 | 显示全部楼层
autoCAD加载ARX程序运行死机的原因很多,把你的具体代码贴出来,以便大家帮你分析!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-22 20:36:08 | 显示全部楼层
本来程序是好好的,可是用了wblock(AcDbDatabase *&newDb,const AcDbObjectIdArray& idArray,const AcGePoint3d* point)这个函数后就出现了那种情况了,是不是因为哪里没有释放的原因呀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-22 22:26:05 | 显示全部楼层
大概是你新建的AcDbDatabase没有delete吧!!
只是猜测,没有看到你的具体代码,不敢肯定!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-23 15:13:21 | 显示全部楼层
我看了,应该不是没有delete的问题。
我执行程序的过程中都很正常,就是在运行完程序后,如果我再打开其他dwg文件,或新建dwg文件,就会死,斑竹分析一下是什么原因呢?
我现在把那部分代码发上来,(主要是choBlock.cpp中的内容有问题)请hillman斑竹一定要帮忙呀!感激不尽!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-23 20:13:06 | 显示全部楼层
在我这里编译不通,无法跟踪调试,不过看了一下代码,在销毁choBlock类的时候应该使用acedSSFree释放m_ssBlock选择集的!!不知道是不是这个问题!!改改看,有问题再说!!

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

使用道具 举报

 楼主| 发表于 2003-12-23 20:30:09 | 显示全部楼层

已经释放了呀

在CopyOilDrawCommands.cpp中,代码如下:// This is command 'ELECHOOSE'
void YANGEleChoose()
{
        // TODO: Implement the command
    CAcModuleResourceOverride myResources;
   /// 1 先检查模板"总图"/"一般图"
    CXPara xPara;
    CChoBlock ChoBlock;
        CString strModelType;
        if (!xPara.GetXrcdData("GQDX_DICT","modeltype",&strModelType))
        {
                AfxMessageBox("当前图形没有modeltype扩展数据,无法访问绘图比例!!");
                return;
        }
        if (0 != strcmp("总图",strModelType))
        {
                AfxMessageBox("当前图形不是总平面图,无法进行总图内容复制!");
                return;
        }
       
        ChoBlock.choElement();
    if(TRUE!=ChoBlock.makeBlock(ChoBlock.m_ssBlock))
        {
        AfxMessageBox("不能正确创建图块!");
                return;
        }
    acedSSFree(ChoBlock.m_ssBlock)  //在这里释放的,有问题 吗?
    ChoBlock.savBlock();
}


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

使用道具 举报

发表于 2003-12-23 21:22:21 | 显示全部楼层
在语句出打断点,调用ACAD起动,执行时自动到断点停止,下面你就可跟踪了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-24 13:27:15 | 显示全部楼层
问题是我执行程序的过程中都没有问题呀;就是执行完了以后再进行其他cad操作时才会死,跟踪也没有用呀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2003-12-24 14:39:47 | 显示全部楼层
我也出过类似的错:
原因是AcdbDatabase 没有Delete
你代码中用AcDbDatabase *pThisDb
pDb没有必要作为类变量,可以在一个函数中控制,建议你做修改(我看来工作量很小);
 ChoBlock.choElement();
    if(TRUE!=ChoBlock.makeBlock(ChoBlock.m_ssBlock))
        {
        AfxMessageBox("不能正确创建图块!");
                return;
        }
    acedSSFree(ChoBlock.m_ssBlock);       
    ChoBlock.savBlock();
可以改一下,在统一类中完成对一个Database的操作.祝你好运!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-24 16:08:50 | 显示全部楼层
好像pThisDb不用delete吧
我试了一下,把pDb放到makeBlock()函数中了,可是怎么还是一样的死呢?唉,我实在是搞不定了,楼上的快帮我看看怎么回事吧。下边是我改后的代码://b制作图块
BOOL CChoBlock::makeBlock(ads_name ss)
{
    long lenSS;                        // 选择集的长度
    ads_name ssEntName;                // 选择集中的实体名
    int rc;                                // 返回值
    long idx;                                       
    Acad::ErrorStatus es=Acad::eOk;
    AcDbObjectIdArray objList;
    AcDbObjectId ownerId=AcDbObjectId::kNull;
    AcDbDatabase *pDb;

    //当前数据库
   AcDbDatabase *pThisDb;
   pThisDb = acdbHostApplicationServices()->workingDatabase();       
   pDb = new AcDbDatabase(Adesk::kFalse);
        /////////加入新实体/////////   
    rc=acedSSLength(ss,&lenSS);
    if(rc!=RTNORM)
   {
         acutPrintf("\nInvalid or empty selection set. ");
         delete pDb;
         eturn FALSE;
   }
   for(idx=0;idx<lenSS;idx++)
   {
   // Get the entity name at the spcified index
    rc = acedSSName(ss, idx, ssEntName);
   if(rc != RTNORM)
   {
        delete pDb;
        break;
    }       
     AcDbObjectId objId;         //实体Id
    acdbGetObjectId(objId,ssEntName);  

        ////将实体写入
        AcDbEntity *pElement;       //实体类型
      
      es=acdbOpenObject(pElement,objId,AcDb::kForWrite);
     if(es!=Acad::eOk)
     {
           acutPrintf("\n不能获得实体类型! ");
           pElement->close();
           delete pDb;
           return FALSE;
      }
      
     if(pElement->ownerId()==ownerId)
     {
          objList.append(objId);
     }
      else if(idx==0)
    {
          ownerId=pElement->ownerId();
          objList.append(objId);
    }
    pElement->close();
        }//for

    AcGePoint3d ptBase;
    ads_point ptBase1;

    acedCommand(RTSTR,"OSNAP",RTSTR,"MID,ENDP,CEN,INS,EXT,NEA",0);
    acedGetPoint(NULL,"\n请指定图块的插入基点...",ptBase1);

                     ptBase[0]=ptBase1[X];
        ptBase[1]=ptBase1[Y];
        ptBase[2]=ptBase1[Z];
        es=pThisDb->wblock(pDb,objList,ptBase);  
        if(es!=Acad::eOk)
        {
                delete pDb;
                return FALSE;
        }
       
        CString strPath("");
        CEnv env;
        strPath += env.ReadDataFromReg();
        strPath += "\\系统支持文件";//(2002.8.12添加)
        strPath += "\\总图内容复制.dwg";       
        es=pDb->saveAs(strPath);
        if(es!=Acad::eOk)
        {
                acutPrintf("\n不能保存图块,请检查!");
                return FALSE;
        }
        else
        {
              acutPrintf("\n已成功的制作并保存了图块!");
        }
        delete pDb;       
        return TRUE;
       
    acedCommand(RTSTR,"OSNAP",RTSTR,"OFF",0);
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-25 09:47:21 | 显示全部楼层
是不是你将当前的数据库删除的原因,在AutoCAD中必有一个当前数据库,且不能被删除,必须要删除时,先将别的数据库设为当前的,再删除。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-25 09:59:29 | 显示全部楼层
我没有删当前数据库pThisDb呀,只是将新建的一个pDb删掉了,真是搞不懂,到底是哪里的原因
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 10:42 , Processed in 0.348151 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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