找回密码
 点一下
查看: 2628|回复: 8

奇怪的测试结果(handle内存泄漏测试)

[复制链接]
发表于 2008-8-19 12:21:25 | 显示全部楼层 |阅读模式
我弄了个测试………………
用了DestroyTrigger和TriggerClearConditions和TriggerClearActions,但是测试结果………………,让我寒心…………
居然有16个泄漏…………
大家看看吧…………
不知道出了什么问题。

Test.w3x

18 KB, 下载次数: 22

 楼主| 发表于 2008-8-19 12:22:22 | 显示全部楼层
貌似DestroyTrigger是不能清除RegisterTriggerXXXXX的?
真是不知道什么原因…………
回复

使用道具 举报

发表于 2008-8-19 12:22:34 | 显示全部楼层
代码呢
还有删除触发动作
回复

使用道具 举报

 楼主| 发表于 2008-8-19 12:25:45 | 显示全部楼层
加了。还是16.
回复

使用道具 举报

发表于 2008-8-20 01:07:18 | 显示全部楼层
局域变量请set null
还有注意 。做这类测试别用等待,最好多次测试,等handle表前面空值填满后取稳定的结果
回复

使用道具 举报

发表于 2008-8-20 01:23:58 | 显示全部楼层
http://www.islga.org/bbs/read.php?tid=17033

这个方法本来就不对
回复

使用道具 举报

发表于 2008-8-20 01:24:35 | 显示全部楼层
稍微计算了一下。一个trigger是1,一个anyevent包含了16个playerunitevent是16,一个condition是1,其中的filter永久占1,(这说明boolexpr无需删除)
经过清理触发,其中event们的handle值自动回收,形成16位的空洞,那第一次的debug值应该是16(回收形成空穴的handle从后往前算),实测第一次得19.。。好吧说明handle回收在函数结束后才开始
依次结果
19
6
26
11
10*n

无聊的话请玩玩效验
1为有句柄,0为会被清空的事件句柄,7为当前所用的点标志,4为以前所用点标志
710000000000000000117  第一次~
400000000000000017114017
400000000000000014114714017
4000000000000001141144147140017

555.玩不下去
回复

使用道具 举报

发表于 2008-9-13 01:47:56 | 显示全部楼层
这段代码并没有泄露,得到这样的结果恰好证明LZ的测试方法不对。

这里涉及了handle表的内部维护方式。war3内部有一个记录handle最大下标的变量和一个空闲handle表、一个已使用handle表。

当申请一个新的handle值时,如果空闲handle表不为空,那么将返回表头的handle;若为空,handle最大下标增1,返回新增handle。当回收一个handle时,把它插到空闲handle表表头。

结合上面的,就不难解释LZ得到的结果了,如果在最后再申请一个新的点的话,你会发现测试值在变小。




第二个等待还是很有必要的。因为handle的回收不是即时的,大概是由另一个线程定时清理handle表吧。(并非是在函数结束时)
回复

使用道具 举报

 楼主| 发表于 2008-9-13 08:17:10 | 显示全部楼层
知道了…………还一直以为是我们家电脑的问题呢……………………
谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-2 15:37 , Processed in 0.198657 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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