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

【已解决】看不懂内存泄漏的代码,帮帮忙

[复制链接]
发表于 2008-7-21 16:42:58 | 显示全部楼层 |阅读模式
[codes=jass]funciton test takes nothing returns nothing
      local integer start
      local integer end
      set    start=H2I( Location( 0,0))

    //这里可以放上你的代码

    set  end=H2I( Location( 0,0))
    if  end-start>1 then
        call BJDebugMsg( "有内存泄露")
    else
          call BJDebugMsg( "没有内存泄露")
    endif
endfunction[/codes]
这是 织梦者 姐姐给我的function好像没看懂。
谁来解释一下?
发表于 2008-7-21 16:49:36 | 显示全部楼层
点的句柄是连续的?
没魔兽实验。。

假设新建点的句柄都连续。

      set      start=H2I( Location( 0,0))


      set   end=H2I( Location( 0,0))

之间如果没泄露点(即创建点,又删除了点)的话

end-start肯定=1

那么就可以解释楼主的疑问了
回复

使用道具 举报

 楼主| 发表于 2008-7-21 17:07:24 | 显示全部楼层
谢谢………………
貌似自己也弄懂了…………
回复

使用道具 举报

发表于 2008-7-21 17:33:37 | 显示全部楼层
话说你很象屠版
回复

使用道具 举报

发表于 2008-7-31 10:51:14 | 显示全部楼层
哇, 很强大的函数..学学习习
回复

使用道具 举报

发表于 2008-7-31 11:18:38 | 显示全部楼层
有些handle不一定是创建和销毁都在一个函数内,比如计时器,触发器,又或者创建后把它记录到缓存里,在别的地方销毁,这些用法都是很常见的

而且,魔兽的内存管理不一定就是点删除后马上清理这个点的空间
回复

使用道具 举报

发表于 2008-7-31 12:54:52 | 显示全部楼层
连续申请的Handle值不一定是连续的
之前使用的Handle对象占用地址被释放后,就不会是一直连续的了~~
回复

使用道具 举报

发表于 2008-9-13 22:54:18 | 显示全部楼层
比如,刚打开魔兽,还没有做其它事情.
申请一个变量A ,    地址是1
再申请一个变量B, 则地址一定是2
再申请一个变量C,则地址一定是3
这时,如果删除B,( 包括句柄),
再申请一个变量C,C的地址应该是2
再申请一个变量D,D的地址应该是4


也就是说,地址,是从小到大搜索,直到找到一个可用的为止.


利用这个特性,可以做一些映射.
比如,想为一个计时器,绑定到一个单位上.
(  比如一个子弹在飞,想飞3秒后,删除子弹.  这时,就要想办法在timeraction里知道,
   哪一个单位才是要删除的子弹呢...)
一般的作法是:  把计时器Handle,单位的Handle,用缓存绑定到一起.
这样可以通过缓存去查.


因为地图上,一共也不会超过1000个单位吧..
在地图初使化时,建立一个长度为1000的数组Timers,每个元素都是一个Timer.
这就能保证这些Timer的Handle是连续存放的.
先记录Timers第一位的Timer的指针,记为Head.  
之后把这些Timer全删掉.   为什么这么做呢,就是为了要占这1000个位子.


这1000个位子,现在还是不可以用的.  因为还有Timers数组的变量在引用它们.
直到把Timers数组的相应位set null后才可以用.

比如,现在数组的Head为A000 0000,  而我想生成一个Timer,并要求这个Timer的Handle是A000 0008
那就很简单的了,  set   Timers[8]=null ,  之后,再CreateTimer, 所得到的Timer的Handle就是A000 0008了.
同时,也很容易知道一个Timer,在数组中的位置了.   比如,A000 0008的位置,就是
A000 0008 - A000 0001 = 8,  第8位么...


这时,如果我们再创建一个数组,为Units, 里面存放着想绑定的单位.
比如想为A000 0008这个Timer绑定一个单位猪头亮,  
先用A000 0008 -  A000 0000 得到8, 之后在Units数组的第8位放上猪头亮就可以了.
以后什么时候想找到这个计时器绑定的单位,  用计时器的Handle 减去  Head ,就得到了
数组的下标,进而知道单位了.


也许到这里,您会想,直接减不就可以么,  非要生成那1000个干什么..
嗯,  这是为了控制长度.  
那1000个点位,是为了保证,以后所生成的计时器的Handle,都应该不大于Head+1000


不然,Head是A000 0000,    生成的一个计时器是A000 A000,这就没办法保存了.
因为A000 A000 - A000 A000 = A000,  也就是10进制的40960,  魔兽的数组没有这么长.
( 就算有,也太浪费空间了. )



其实,真正用起来,还有一些技巧..   这个是DataSystem的一部分,也是思想的核心.
(    本来想给你找一些代码的,  可是 该死的渣老白居然把Ftp关了... )
回复

使用道具 举报

发表于 2008-12-11 13:50:39 | 显示全部楼层
我还是不懂
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 18:26 , Processed in 0.112911 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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