找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2121|回复: 3

[求助]:createFromCurves是不是有内存泄漏?!

[复制链接]
发表于 2003-8-1 12:42:41 | 显示全部楼层 |阅读模式

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

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

×
我发现在用explode函数炸开后,删除对象时,若这样删除:
for (i = 0; i < lines.length(); i++)        
delete  lines;
就会有内存泄漏,但这样删除:
for (i = 0; i < lines.length(); i++)
delete (AcRxObject*)lines;
就不会有泄漏,

但我发现只要是调用createFromCurves形成AcDbRegion,再用上面的形式删除生成的区域,还是有内存泄漏,是不是createFromCurves有问题呢?
我用的R14.arx202.用它的例子POLYSAMP,我将其polyedit函数改造了一下,在thickenPoly函数内,
循环1000,对3d实体的操作都取消,用炸开的曲线生成region,再将炸开的曲线和region都删除。这时就会有内存泄漏。我用2000的内存监视器看一般要耗2-3M内存。但将createFromCurves函数去掉。即不生成AcDbRegion,就不会有内存泄漏。所以,我不知是createFromCurves的问题还是delete region时的问题。
哪位高手遇到过这种问题吗?很急啊。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-8-1 13:04:54 | 显示全部楼层

Re: [求助]:createFromCurves是不是有内存泄漏?!

最初由 catwang_G 发布
[B]我发现在用explode函数炸开后,删除对象时,若这样删除:
for (i = 0; i < lines.length(); i++)        
delete  lines;
就会有内存泄漏,但这样删除:
for (i = 0; i < lines.length(); i++)
delete (AcRxObject... [/B]


createFromCurves是涉及到了内存的分配,你需要小心的使用.
以前有讨论的,看看下面的帖子
http://www.xdcad.net/forum/showt ... d=289139#post289139
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-1 13:27:47 | 显示全部楼层
将DLLIMPEXP void  polyeditCommand()中一段改为
                else if (strcmp(option, "Thicken") == 0) {
            
            if (!ent->isKindOf(AsdkPoly::desc())) {
                ads_printf("\nNot Applicable");
                continue;
            }
            eMode = PolyEdit::kThicken;
            AOK(thickenPoly(poly));
            
         //   solid = AcDb3dSolid::cast(ent);
         //   assert(solid != NULL);
         //   poly = NULL;
            
            
         //   solid->draw();
            
        }


static Acad::ErrorStatus
thickenPoly(AsdkPoly* poly)
{
    Acad::ErrorStatus es = Acad::eOk;
        for(int i=0;i<1000;i++)//
        {
                int i;
                AcDbVoidPtrArray lines;
                AcDbVoidPtrArray regions;
               
                // Explode to a set of lines
                if ((es = poly->explode(lines)) != Acad::eOk) {
                        for (i = 0; i < lines.length(); i++) {
                                delete (AcRxObject*)lines;
                        }
                        for (i = 0; i < regions.length(); i++) {
                                delete (AcRxObject*)regions;
                        }
                        return es;
                }
       
                //AcDbRegion*
                // Create a region from the set of lines.
                if ((es = AcDbRegion::createFromCurves(lines, regions)) != Acad::eOk) {
                        for (i = 0; i < lines.length(); i++) {
                                delete (AcRxObject*)lines;
                        }
                        for (i = 0; i < regions.length(); i++) {
                                delete (AcRxObject*)regions;
                        }
                        return es;
                }

                assert(regions.length() == 1);
                AcDbRegion* region = AcDbRegion::cast((AcRxObject*)regions[0]);
                assert(region != NULL);
               
                // Extrude the region to create a solid.
/*                double height;
                if ((es = poly->getDistAtParam(6.28318530717958647692, height))
                        != Acad::eOk)
                {
                        for (i = 0; i < lines.length(); i++) {
                                delete lines;//(AcRxObject*)
                        }
                        for (i = 0; i < regions.length(); i++) {
                                delete (AcRxObject*)regions;
                        }
                        return es;
                }
                height *= 0.25;
*/               
/*                AcDb3dSolid* solid = new AcDb3dSolid;
                assert(solid != NULL);
                if ((es = solid->extrude(region, height, 0.0)) != Acad::eOk) {
                        delete solid;
                        for (i = 0; i < lines.length(); i++) {
                                delete (AcRxObject*)lines;
                        }
                        for (i = 0; i < regions.length(); i++) {
                                delete (AcRxObject*)regions;
                        }
                        return es;
                }
               
                // Save up the data to flatten the solid.
                //
                savedCenter     = poly->center();
                savedStartPoint = poly->startPoint();
                savedNumSides   = poly->numSides();
                savedNormal     = poly->normal();
               
                // Copy the poly name
                //
                strcpy(savedName, poly->name());
               
                // Now we have a solid. Change the entity to be this solid
               
                if ((es = solid->setPropertiesFrom(poly)) != Acad::eOk) {
                        delete solid;
                        for (i = 0; i < lines.length(); i++) {
                                delete (AcRxObject*)lines;
                        }
                        for (i = 0; i < regions.length(); i++) {
                                delete (AcRxObject*)regions;
                        }
                        return es;
                }
               
                ent = poly;
                if ((es = ent->upgradeOpen()) != Acad::eOk) {
                        delete solid;
                        for (i = 0; i < lines.length(); i++) {
                                delete (AcRxObject*)lines;
                        }
                        for (i = 0; i < regions.length(); i++) {
                                delete (AcRxObject*)regions;
                        }
                        return es;
                }
                es = replaceEntity(ent, solid);
                if ((es != Acad::eOk) && (es != Acad::eObjectToBeDeleted)) {
                        ent->downgradeOpen();
                        delete solid;
                        for (i = 0; i < lines.length(); i++) {
                                delete (AcRxObject*)lines;
                        }
                        for (i = 0; i < regions.length(); i++) {
                                delete (AcRxObject*)regions;
                        }
                        return es;
                }
                es = ent->downgradeOpen();
*/
               
                for (i = 0; i < lines.length(); i++) {
                        delete (AcRxObject*)lines;//
                }
                for (i = 0; i < regions.length(); i++) {
                        delete (AcRxObject*)regions;
                }
        }
    return es;
}
这样有内存泄漏,应该不存在上个贴子说的问题。

修改的代码是arx202里的polysmap例子,大家也试试。
真的有内存泄漏啊,我该怎么办?

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

使用道具 举报

发表于 2014-12-20 00:44:31 | 显示全部楼层
我也遇到这问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 14:33 , Processed in 0.318745 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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