找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 774|回复: 2

[分享]:清除xdata 防止内存泄漏

[复制链接]
发表于 2004-7-22 17:48:02 | 显示全部楼层 |阅读模式

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

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

×
以前论坛上摘录了一个清除xdata的函数,今天用用,发现有个隐蔽的内存泄漏

  1. void removeXdata()
  2. {
  3.     ads_name eNam;
  4.         ads_point pt;
  5.         int i = acedEntSel ("\nPick an object:", eNam, pt);
  6.         if (RTNORM != i)       
  7.         {       
  8.                 return;       
  9.         }
  10.         AcDbObjectId ObjId;
  11.         acdbGetObjectId(ObjId, eNam);
  12.         AcDbEntity *pEnt;
  13.         acdbOpenAcDbEntity(pEnt, ObjId, AcDb::kForWrite);
  14.         resbuf *xdata = pEnt->xData(NULL);
  15.         if (xdata)       
  16.         {
  17.                 resbuf *nextbuf=xdata->rbnext;
  18.                 xdata->rbnext = NULL;
  19.                 pEnt->setXData(xdata);
  20.                 acutRelRb(xdata);
  21.                 acutRelRb(nextbuf);   [COLOR=red]//注意这里释放, 否则导致内存泄漏         [/COLOR]        
  22.         }
  23.        
  24.         pEnt->close();
  25. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-7-22 17:58:55 | 显示全部楼层
ObjectArx Samples中好象没有使
用acutRelRb(nextbuf);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-22 20:58:08 | 显示全部楼层
楼主给的程序仍然有问题,该程序仅仅清除xdata中的第一个AppName对应的扩展数据。
实际上,实体(Entity)中可能不止包含一个AppName的扩展数据, 必须使用下面程序才能
彻底清除实体上的所有扩展数据:

  1. AcDbObjectId ObjId;
  2. acdbGetObjectId(ObjId, eNam);
  3. AcDbEntity *pEnt;
  4. resbuf  Tmp, *xp;

  5. acdbOpenAcDbEntity(pEnt, ObjId, AcDb::kForWrite);
  6. resbuf *xdata = pEnt->xData(NULL);
  7. if (xdata)
  8. {
  9.       Tmp.rbnext = NULL;
  10.       Tmp.restype = 1001;

  11.        for (xp = xdata; xp; xp=xp->rbnext)
  12.       {
  13.              if (xp->restype  ==  1001)
  14.              {
  15.                      Tmp.resval.rstring = xp->resval.rstring;
  16.                       pEnt->setXData(&Tmp);
  17.              }
  18.        }
  19.       acutRelRb(xdata);
  20. }
  21.        
  22. pEnt->close();

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 21:34 , Processed in 0.382188 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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