找回密码
 点一下
查看: 1522|回复: 17

关于创建单位存在两个内存泄漏的浅见

[复制链接]
发表于 2009-6-30 12:16:57 | 显示全部楼层 |阅读模式
创建一个单位时:
在J中使用的是:CreateNUnitsAtLoc命令。


而使用CreateNUnitsAtLoc时
不仅有点泄露,还有单位组泄露
虽然 每次函数运行时 都会
  call GroupClear(bj_lastCreatedGroup)
    loop
        set count = count - 1
        exitwhen count < 0
        call CreateUnitAtLocSaveLast(whichPlayer, unitId, loc, face)
        call GroupAddUnit(bj_lastCreatedGroup, bj_lastCreatedUnit)
    endloop
    return bj_lastCreatedGroup


先清除单位组中单位
但据老狼说:GroupClear是把 生活废品 扫床下就不管了,DestroyGroup才是把 生活废品 清扫进废品桶倒掉(太鱼了..laji2字被屏蔽)
所以使用 CreateNUnitsAtLoc 仍然单位组泄露

但是。疯游的本人认为当下一次使用bj_lastCreatedGroup时,并没有创建另外的一个单位组,在JASS BJ语言中,用的还是:bj_lastCreatedGroup
所以不可能您使用创建一单位的触发一百次,就创建一百个单位组,而是一直在共用:bj_lastCreatedGroup一个单位组。

所以,使用CreateNUnitsAtLoc命令时,根本不需要担心单位组泄漏,只用担心不泄漏点就行。

以上是本人的观点。

久仰GA是当今JASS武林中的泰山北斗,亦是同道中人,希望指点迷津。
如果您觉得创建一个单位就泄漏一个单位组,那该如何防止单位组泄漏?


发表于 2009-6-30 12:28:48 | 显示全部楼层
hmmm,其实这个不要使用这个函数,直接用CreateUnit吧,常见多个单位就用循环来做,恩
回复

使用道具 举报

 楼主| 发表于 2009-6-30 12:41:05 | 显示全部楼层

回 1楼(zhuzeitou) 的帖子

看来楼上的观点是说,创建单位时会存在单位组泄漏了?


点排漏,就不用做了,大家都知道。
只是创建单位时的排泄,许多作者不重视。
阁下能把下面地图做一个单位组排泄给在下看否?
在下不胜感激!

关于单位组泄漏.w3x

35 KB, 下载次数: 8

回复

使用道具 举报

发表于 2009-6-30 12:54:52 | 显示全部楼层
防止这些泄露很简单,废弃BJ函数,全部CJ函数
回复

使用道具 举报

发表于 2009-6-30 13:07:45 | 显示全部楼层
用 CreateUnit 没有泄露 它不会创造单位组 也不会创造点


单位组 要排泄 要三个方面

第一 排泄单位组 内部的数据 即:GroupClear函数 当然在确定单位组已经没有存储任何数据的时候不一定要使用这个函数

第二 销毁单位组 这个对象 即:DestroyGroup

第三 清除单位组变量储存的句柄值 即:set 某单位组变量 = null 这个对于局部变量而言,全局的话,分配之后就一直存在了,清不清除无所谓

单位组 就像JAVA中一个类 其实就是自己构造的变量
创造一个类的对象的时候
其实就是 用一个 变量 来储存一个类似内存地址的东西(当然不是物理地址,不过可以通过这个东西找到内存的一块区域) 这个变量就指向一个比较大的内存区域 这个区域里存放的 是你对象的成员变量 比如单位组里 应该就是一个 数组 来存储 单位

所以 你要排泄的时候
首先要删除 那个数组里存储的数据 这里单位也不是基础变量 所以要销毁 如果是 点 里面2个成员变量是 标准变量 那么这一步就不需要了,所以排泄点 就只要2步
然后 你要销毁这个对象 就是释放 那个较大的被指向的内存区域
然后 还剩下一个 用来存地址的 变量也要 释放

其实这一起造成的原因就是 暴雪 太懒。。完全没有 任何回收机制 导致所有非基础变量都要手动来排泄
回复

使用道具 举报

 楼主| 发表于 2009-6-30 13:09:49 | 显示全部楼层

回 3楼(lunaflywar) 的帖子

照楼主的说法,


CreateUnitAtLoc代替CreateNUnitsAtLoc就可以了?

回四楼的
四楼的意思是这样吧:
call GroupClear( udg_group )
call DestroyGroup( udg_group )
set udg_group=CreateGroup()
回复

使用道具 举报

发表于 2009-6-30 13:10:55 | 显示全部楼层
应该是
CreateUnit

CreateUnitAtLoc
还是会有点泄露
回复

使用道具 举报

发表于 2009-6-30 13:17:38 | 显示全部楼层

回 5楼(无极之魄) 的帖子

全局变量的话 你最后一步可以不做
回复

使用道具 举报

 楼主| 发表于 2009-6-30 13:18:46 | 显示全部楼层

回 6楼(囧rz..) 的帖子

谢谢楼上的,
但点泄露,大家都知道的。
只是许多同学们不重视单位组的排泄。
许多作者创建单位都是这样
call CreateNUnitsAtLoc( 1, 'hfoo', Player(0), point. bj_UNIT_FACING )


set udg_group=CreateGroup()这个第三步,可以不做么?
但某些触发中没有这个好象会出现问题:
比如新无界变幻III的根须缠绕,我只做了第一,第二步,
call GroupClear( udg_group1 )
call DestroyGroup( udg_group 1)
call GroupClear( udg_group 2)
call DestroyGroup( udg_group 2)

结果出现了一个永远的缠绕。


最后,大家都认为创建单位除了产生点泄漏还会产生一个单位组泄漏么?
汗,没有人支持我一楼的无单位组漏泄观点?
附:我的观点是CreateNUnitsAtLo创建单位产生一个点泄漏,但不会产生单位组泄漏。

无界变幻 III未加密版.w3x

83 KB, 下载次数: 8

回复

使用道具 举报

发表于 2009-6-30 13:26:14 | 显示全部楼层
我是说set udg_group=null 对于全局变量来说不要做
set udg_group=CreateGroup()....是创造一个新单位组
回复

使用道具 举报

发表于 2009-6-30 13:30:01 | 显示全部楼层
因为这里基本都是用JASS,用JASS就不会用XXXLoc这种函数,都是直接坐标计算
回复

使用道具 举报

发表于 2009-6-30 13:34:58 | 显示全部楼层
囧。。。
被感谢了N次
回复

使用道具 举报

发表于 2009-6-30 13:35:51 | 显示全部楼层
囧rz..
因为名字的缘故吗...
详细解释的感谢
回复

使用道具 举报

 楼主| 发表于 2009-6-30 13:44:33 | 显示全部楼层

回 10楼(lunaflywar) 的帖子

谢谢楼上的,
但我辈用习惯了使用point中心点座标_AtLoc,不太喜欢使用X,Y座标。
疯游坏人们习惯把全局变量和局部变量一起混合使用,WE和J混用
我觉得这么写是最好的:
call CreateUnitAtLoc( Player(0), 'hfoo',  udg_point, bj_UNIT_FACING )
or
call CreateUnitAtLoc( Player(0), 'hfoo',  point, bj_UNIT_FACING )



CreateUnitAtLoc    使用的也是CJ函数     takes player id, integer unitid, location whichLocation, real face returns unit


CreateUnit  使用的           takes player id, integer unitid, real x, real y, real face returns unit
是X,Y座标,不太喜欢
回复

使用道具 举报

 楼主| 发表于 2009-6-30 13:54:27 | 显示全部楼层

回 12楼(lunaflywar) 的帖子

最后,大家都认为使用CreateUnitAtLoc创建单位除了产生点泄漏还会产生一个单位组泄漏么?

汗,有没有人支持我一楼的无单位组漏泄观点?
附:我的观点是CreateNUnitsAtLo创建单位产生一个点泄漏,但不会产生单位组泄漏。

看来,大伙儿的意思是,使用CreateNUnitsAtLo绝对产生单位组泄漏?
希望正面回答下这个问题。

3K,


呤诗一首,感谢诸君!

不出疯游,大言修改地图天下无敌手。
邂逅GA,  ,方信创作JASS世间有英雄。
回复

使用道具 举报

发表于 2009-6-30 15:49:16 | 显示全部楼层

Re:关于创建单位存在两个内存泄漏的浅见

引用第2楼无极之魄于2009-06-30 12:41发表的 回 1楼(zhuzeitou) 的帖子 :
看来楼上的观点是说,创建单位时会存在单位组泄漏了?


点排漏,就不用做了,大家都知道。
只是创建单位时的排泄,许多作者不重视。
.......

其实也不是说会泄露,这个利用的是全局变量,无所谓的
主要是觉得直接使用cj会比较好,要创建多个单位自己利用循环实现一个CreateNUnit的函数,不要用到单位组,也就避免了这个问题
回复

使用道具 举报

发表于 2009-6-30 15:59:58 | 显示全部楼层
么呀...这个是橙子某鱼贴吧...

再往下看...有答案的说,无泄

话说lz好有才
回复

使用道具 举报

发表于 2009-7-1 09:07:27 | 显示全部楼层
从来不用CreateNUnit
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 07:26 , Processed in 0.097466 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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