|
比如这里有个函数
[jass]
function createu takes player p,location l returns nothing
call PolledWait(10)
call CreateUnitAtLoc(p,'hfoo',l,bj_UNIT_FACING)
endfunction
function callu takes nothing returns nothing
local unit u=GetTriggerUnit()
local player p=GetOwningPlayer(u)
local location l=GetUnitLoc(u)
call createu(p,l)
set u=null
endfunction
[/jass]
这样,玩家p和点l没有被清除,就产生了泄露
要排泄只需加上
[jass]call RemoveLocation(l)
set l=null
set p=null[/jass]
这里就有疑问了...
因为p和l是被当作参数传递给上面的函数来使用的,如果接着set u=null的下面排泄掉了,那上面的函数不就没有东西可用了么...
(这里为了方便理解,特意在创建步兵前加了10秒等待)
因为据偶观察,一个函数在执行时,不管上一句调用的函数里有多少东西没做完,这个函数会继续往下执行
所以猜想,如果接着排泄完了,那么上一个函数等待完后想执行创建单位,会不会有以下几种可能...
1 参数已经被传递过来了,并且在内存里占了不同的位置(即h2i值是独立的),所以不管之前有没排泄都会正确创建步兵,这时就需要在创建步兵后再次排泄
2 参数已经被传递过来了,但h2i值与传递前的一样,如果在前面就被清空,那么这里也会变null
3 参数在传递过来之后就被清空了,但因作为参数,所以会在内存里出现一块临时地址用于储存,等到动作执行完后会自动清空
4 当call createu(p,l)时,首先会把参数的值赋予该函数下每个动作后才会继续执行下面的set u=null等等动作,因为已被赋值,所以动作能顺利完成,当函数执行完毕后,自动清空
好吧...简单的说,就是清空点l和玩家p应该在哪清...
可能是以前看教程时把当时觉得难以理解的东西跳过了,导致出现了一些基础理论不足...现在回头去找也没见到类似的问题
在看别人的演示时,基本没有发现传递参数后排泄的过程,又没见过象样的讨论帖...于是此疑问便诞生... |
|