找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1531|回复: 4

[ARX函数]:在AcDbVoidPtrArray中delete 掉每个指针成员后是否就全部释放了内存?

[复制链接]
发表于 2003-8-2 20:11:08 | 显示全部楼层 |阅读模式

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

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

×
请看如下代码:
AcDbVoidPtrArray  regions;
int iCount = regions.length()) ;
for(i = 0; i < iCount; i++)
     delete (AcDbRegion *)regions.at(i);
这是我在以前贴子中看到的代码,虽然指针成员已全部删除释放了,但AcDbVoidPtrArray的长度并不为零,应再用regions.removeLast()等函数清空数组,这样才能把占用的内存全部释放。
由于水平有限,也许我的看法不对,还请各位指正。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-8-3 10:11:38 | 显示全部楼层
只是释放了 (AcDbRegion *)regions.at(i)   所指向的地址。数组里面的指针变量人然存在,此时指向的地址是null罢了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-8-3 11:11:45 | 显示全部楼层

Re: [ARX函数]:在AcDbVoidPtrArray中delete 掉每个指针成员后是否就全部释放了内存?

最初由 fengyou 发布
[B]请看如下代码:
AcDbVoidPtrArray  regions;
int iCount = regions.length()) ;
for(i = 0; i < iCount; i++)
     delete (AcDbRegion *)regions.at(i);
这是我在以前贴子中看到的代码,虽然指针成员已全部删?.. [/B]


你的看法不对,你可以去研究一下AcArray的模板.

这应该是一个C++的探讨,但愿我不会让你更加迷糊

AcDbVoidPtrArray::length()为零并不表示一个AcDbVoidPtrArray对象占用的内存全部释放了。

在你所举的例子中,regions 本身是个栈对象。而regions本身存储的只是一些指针,AcDbVoidPtrArray的析构函数并不负责(也不应该)去(自动)销毁这些指针指向的对象。

栈对象regions 一旦离开它的作用域,即便是没有调用regions.removeLast()等函数它也会自己调用析构函数销毁自己(仅仅是真正的全部释放了regions自己而已).

只有当regions存储的指针指向的是堆对象,才可能有必要delete该指针指向的对象。(特别的,在Arx中,即便是堆对象如果你已经将其指向的对象成功加入了acad图形数据库,你也不应该delete,因为这个时候ACAD已经接管了该对象)

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

使用道具 举报

发表于 2003-8-3 11:19:23 | 显示全部楼层
最初由 asky333 发布
[B]只是释放了 (AcDbRegion *)regions.at(i)   所指向的地址。数组里面的指针变量人然存在,此时指向的地址是null罢了。 [/B]


delete (AcDbRegion *)regions.at(i) 对regions不会产生任何影响,  regions.at(i)的值不会有任何变化,不会变成NULL,只是它指向的对象已经不复存在,此时,它已经变成一个指针
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-3 21:08:14 | 显示全部楼层
首先感谢二位的回复。
我也明白如果有需要delete的指针,一般是new 出来的,要有用户负责删除。不知有没有把野指针也从数组中清除的必要,只是感觉如果不把数组清空,就好像不保险。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 02:41 , Processed in 0.343681 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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