这个函数中的group对象会造成泄露么?
魔兽地图编辑器吧
全部回复
仅看楼主
level 7
213cy 楼主
有这样一个函数
我在其他的函数中调用它
set g2 = GetUnitsOfPlayerAndTypeId( .... )
然后用接着排泄g2
call DestroyGroup( g2 )
set g2 = null
那么第一函数中的 g 会产生泄露么
2021年11月07日 06点11分 1
level 11
不会
2021年11月07日 08点11分 2
level 11
感觉应该会吧,函数里的g不是没set null吗不是很懂,求解答
2021年11月07日 10点11分 3
level 7
首先分析函数行为 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函数。
如有不对,还请各路大神指正。
2021年11月07日 13点11分 4
非常感谢!
2021年11月13日 11点11分
吧务
level 15
用全局变量代替g
2021年11月08日 04点11分 5
level 9
不会
2021年11月08日 05点11分 6
level 8
肯定会泄露的,这就相当于a=1,b=a,你让b=null了,a还是=1,你返回一个指针变量实际上返回的是整数地址,不是变量本身,而且你再也没办法获取这个变量了,除非能直接操作内存
2021年11月10日 09点11分 7
1