魔兽地图编辑器吧 关注:65,182贴子:3,838,154
  • 7回复贴,共1

这个函数中的group对象会造成泄露么?

只看楼主收藏回复

有这样一个函数

我在其他的函数中调用它
set g2 = GetUnitsOfPlayerAndTypeId( .... )
然后用接着排泄g2
call DestroyGroup( g2 )
set g2 = null
那么第一函数中的 g 会产生泄露么


IP属地:河南1楼2021-11-07 14:27回复
    不会


    IP属地:湖南来自Android客户端2楼2021-11-07 16:17
    回复
      感觉应该会吧,函数里的g不是没set null吗不是很懂,求解答


      IP属地:广东来自Android客户端3楼2021-11-07 18:20
      回复
        首先分析函数行为 GetUnitsOfPlayerAndTypeId
        第一句代码:local group g = CreateGroup()
        这句代码做其实做了两件事
        1.CreateGroup() 创建一个单位组,会得到1个handle,这里我们简单记为 handle_G
        2.将 handle_G 赋值给局部变量 g ,那么handle_G的引用次数+1
        查看后续代码中并没有set null 这种操作,当然这种写法也注定无法使用set null,因为他要返回g。
        那么直到 GetUnitsOfPlayerAndTypeId(...) 函数执行完毕,handle_G的引用次数依旧是1次。
        然后再看你的代码
        set g2 = GetUnitsOfPlayerAndTypeId( .... )
        call DestroyGroup( g2 )
        set g2 = null
        通过上文解释能知道 GetUnitsOfPlayerAndTypeId 会返回一个handle给我们,我们记为 handle_G,并且handle_G的引用计数为1。
        如果你理解了上面说的,那么
        set g2 = GetUnitsOfPlayerAndTypeId( .... )就相当于 set g2 = handle_G
        这里将hanlde_G赋值给g2,那么hanlde的引用计数再+1,这时候handle_G的引用计数就变为了2。
        set g2 = null 这条代码的作用其实就是将hanlde_G的引用计数-1
        那么最终 hanlde_G的引用计数等于1,这样handle是不会释放的,从而产生泄露。因为你再也找不到这个handle了。
        另外再提醒一下,不记得哪看的文档或者别人告诉我的,再删除单位组之前,你应该先对单位组进行清空。
        很久没写过jass了如果没记错的话函数应该是 ClearGroup,记错了就自己查查吧。
        应该这样写
        call ClearGroup(g2)
        call DestroyGroup(g2)
        set g2 = null
        如何避免这种泄露?
        不用辣鸡BJ函数。
        如有不对,还请各路大神指正。


        IP属地:湖南4楼2021-11-07 21:10
        收起回复
          用全局变量代替g


          IP属地:北京5楼2021-11-08 12:42
          回复
            不会


            IP属地:上海来自Android客户端6楼2021-11-08 13:19
            回复
              肯定会泄露的,这就相当于a=1,b=a,你让b=null了,a还是=1,你返回一个指针变量实际上返回的是整数地址,不是变量本身,而且你再也没办法获取这个变量了,除非能直接操作内存


              IP属地:湖北7楼2021-11-10 17:38
              回复