1、什么情况下要用DestroyBoolExpr来删除布尔表达式?这样不会破坏原来的布尔表达式的函数吗?
是不是用它判断完了如果不再用就应该删了。
是,和那个函数无关,直是实例化了1个对象
2、看了ForGroupBJ函数明白了为什么设置了bj_wantDestroyGroup会排除泄露,那看一下下面的2个程序是不是会产生泄露。
第1个应该是不会的了,第2个好像没有清除由GetUnitsInRangeOfLocMatching内部创建的局部单位组,反而重复Destroy了这个g。
第2个,g=那个局部变量的单位组
[quote]关于值传递的问题,如果是set g = whichGroup这样的东西的话,传递的是内存地址(并非whichGroup自身的地址,而是单位组的地址),使用DestroyGroup(whichGroup)只是释放whichGroup指向的单位组占据的内存空间,但whichGroup本身自己占据的内存还是存在的,也就是还是有泄漏,这也是为什么经常看到set whichGroup=null.只有在set null之后才算是真正的无泄漏了.不过比起单位组来,一个whichGroup占据的空间基本可以忽略不计了,平时也不必太在意这个.
[/quote]
就豆腐说的这个泄露
3、刚看过大蛇的关于排泄的转帖,为什么用GetUnitsInRangeOfLocMatching选取单位进行动作能正常排泄,而用GetUnitsOfTypeIdAll就无法选取单位?
是不是因为GetUnitsOfTypeIdAll中使用GroupAddGroup导致运行一次后g被Destroy了?
GetUnitsOfTypeIdAll可以选取单位啊?谁说不能?
他的原理是循环选取玩家1-16的所有单位 判断类型 如果是那个参数类型的 就加进单位组g
然后把g里单位加进result
之后清除单位组g中单位,再次选取下一个玩家
直到所有玩家的那个类型单位都被加进result后 就删除单位组g,并把result返回给函数
COPY JASSCODEJASS:
function GetUnitsOfTypeIdAllFilter takes nothing returns boolean
return GetUnitTypeId(GetFilterUnit()) == bj_groupEnumTypeId
endfunction
// =======================================
====================================
function InitBlizzardGlobals takes nothing returns nothing
set filterGetUnitsOfTypeIdAll = Filter(function GetUnitsOfTypeIdAllFilter)
endfunction
// =======================================
====================================
function GetUnitsOfTypeIdAll takes integer unitid returns group
local group result = CreateGroup()
local group g = CreateGroup()
local integer index
set index = 0
loop
set bj_groupEnumTypeId = unitid
call GroupClear(g)
call GroupEnumUnitsOfPlayer(g, Player(index), filterGetUnitsOfTypeIdAll)
call GroupAddGroup(g, result)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call DestroyGroup(g)
return result
endfunctionShingo Jass Highlighter 0.4
4、第3个问题的解决方法,是否可以这样?
这里又与第二个问题的相关,个人认为是错的。如果不对是不是只能用选取地图上的满足匹配单位类型是'abcd'的所有单位来选取……
这样和之前那个函数结果都一样。
他是分别选取每个玩家的所有单位 判断那个类型 再加进单位组
而你是 选取所有玩家的单位加进单位组 再判断那个类型
5、用GroupEnumUnitsOfPlayer这类函数是否会先清空单位组,再添加进去?
看GetUnitsOfTypeIdAll中的情况好像是,否则也不用中间变量的单位组g了。
我也去测试下