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

单位组中随机选取单位怎么破坏这个单位组?

[复制链接]
发表于 2010-10-9 20:24:24 | 显示全部楼层 |阅读模式
    local group a =GetUnitsInRangeOfLocAll(512, GetUnitLoc(gg_unit_Ewar_0011))//得到单位组
    call KillUnit( GroupPickRandomUnit(a) )//的确杀死了单位组中的某一个单位
    call DestroyGroup(a)//这个是破坏掉单位组
    call Text(I2S(GetHandleId(a)))//打印单位组a的ID
但是结果是单位组的ID是xxxxx而不是0,那么这样这个单位组a是泄露了吗?
下面是这个函数的原型。。。。。。下面有清空单位组的办法,但是我看不懂。
function GroupPickRandomUnit takes group whichGroup returns unit
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false
    set bj_groupRandomConsidered = 0
    set bj_groupRandomCurrentPick = null
    call ForGroup(whichGroup, function GroupPickRandomUnitEnum)
    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
    return bj_groupRandomCurrentPick
endfunction
发表于 2010-10-9 21:13:10 | 显示全部楼层
set a=null  没释放内存 所以..............
回复

使用道具 举报

发表于 2010-10-9 21:22:53 | 显示全部楼层
引用数和handle表没释放... 内存貌似释放了吧
回复

使用道具 举报

发表于 2010-10-9 21:36:58 | 显示全部楼层
[jass]
local group a = CreateGroup()
    call GroupEnumUnitsInRangeOfLoc(a, GetUnitLoc(gg_unit_Ewar_0011),512,null)//得到单位组
    call KillUnit( GroupPickRandomUnit(a) )//的确杀死了单位组中的某一个单位
    call DestroyGroup(a)//这个是破坏掉单位组
    if FirstOfGroup(a)==null then
      call DisplayTextToPlayer( Player(0), 0, 0, "xx" )
    call GroupEnumUnitsInRangeOfLoc(a, GetUnitLoc(gg_unit_Ewar_0011),512,null)//得到单位组
    call KillUnit( GroupPickRandomUnit(a) )//的确杀死了单位组中的某一个单位    你觉得这样会杀死几个是1是2?
    call DestroyGroup(a)
     endif
    call Text(I2S(H2I(a)))//打印单位组a的ID
    //set a = null    把这个//去掉或不去掉 重复测试      
[/jass]
xx1.jpg 释放内存 set a = null
xx.jpg 不释放内存   //set a = null
回复

使用道具 举报

 楼主| 发表于 2010-10-9 21:46:24 | 显示全部楼层
等等我就试试。。。
回复

使用道具 举报

 楼主| 发表于 2010-10-9 21:55:29 | 显示全部楼层
额。。set xx=null之后为什么下次杀的时候开了一个新的单位组?为什么不是一直用旧的那个而是交替的?奇怪。。
回复

使用道具 举报

发表于 2010-10-9 22:12:43 | 显示全部楼层
call DestroyGroup(a)//这个是破坏掉单位组
if FirstOfGroup(a)==null then
  call DisplayTextToPlayer( Player(0), 0, 0, "xx" )
再选取杀死 call GroupEnumUnitsInRangeOfLoc(a, GetUnitLoc(gg_unit_Ewar_0011),512,null)//得到单位组
call KillUnit( GroupPickRandomUnit(a) )显然没有单位死亡 说明单位组已经被干掉了
回复

使用道具 举报

 楼主| 发表于 2010-10-9 22:17:17 | 显示全部楼层
哦,就是说一句清除了。。。
回复

使用道具 举报

发表于 2010-10-9 22:22:23 | 显示全部楼层
Destory后 单位组实际上已经消失了...
但是因为变量只是记录了handle值而已,没人会通知它,这个handle对应的单位组已经不存在了

但是为了避免这个变量有可能会指向其他什么怪怪的东西,handle表有一个引用计数的机制,即每当set变量指向这个handle时,这个handle的引用计数会+1,变量值发生变化的同时,原先所指向的handle的引用计数会-1。只有引用计数为0的handle才可能被回收再利用...

所以 Destory啊Remove啊什么的用来干掉对象的实体... set null啊什么的用来释放引用计数,以便handle表能回收再利用这个handle值...

这个机制可恶么?看看有时候rb+gc拿着一个实体已经被干掉的单位的handle值试图强制转换返回出一个单位时造成的弹出就明白了... 这东西还是有存在的必要的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 07:57 , Processed in 0.038821 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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