|
发表于 2008-8-27 00:11:05
|
显示全部楼层
LS就不能委婉点说……
---------------------------免费赠送上我当年学泄漏的原版教材给LZ吧-------------------------------
撕开内裤任风吹(366017990) 02:43:50
那,问大家一个常识性问题
撕开内裤任风吹(366017990) 02:44:08
如果我希望对某个特定单位进行操作n次,应该怎么般呢
撕开内裤任风吹(366017990) 02:44:27
比如对他造成5次伤害,每次间隔1秒
撕开内裤任风吹(366017990) 02:44:34
数值随意
SqlInjection(824674478) 02:44:42
循环5次。。。
撕开内裤任风吹(366017990) 02:45:27
标准的做法是
设置变量A=某单位
循环开始
等待
OOXX
结束循环
f l U x(13707980) 02:45:36
嗯
撕开内裤任风吹(366017990) 02:45:40
其中OOXX都是对A进行操作
撕开内裤任风吹(366017990) 02:45:52
那么这个"A"到底代表什么呢?
撕开内裤任风吹(366017990) 02:46:16
实际上“某单位”是有一个存储空间的
f l U x(13707980) 02:46:29
是一个指针?指向那个空间?
撕开内裤任风吹(366017990) 02:46:43
这个A只是一个用来标记指向那个“某单位”空间的东西
撕开内裤任风吹(366017990) 02:47:28
如果
设置A=某单位
设置B=某单位
删除A
那么会发生什么事情呢?
f l U x(13707980) 02:47:47
b没用了...
撕开内裤任风吹(366017990) 02:48:02
正确。
SqlInjection(824674478) 02:48:05
额
撕开内裤任风吹(366017990) 02:48:25
但是b仍然是一个标记,而且还是指向那个“某单位”的空间
撕开内裤任风吹(366017990) 02:48:56
删除A只是把A指向的那个空间标记为“可回收”
撕开内裤任风吹(366017990) 02:49:09
注意:仅仅是“可回收”
撕开内裤任风吹(366017990) 02:49:37
由于还有另外一个东西指向他,所以这个空间并没有被马上回收
撕开内裤任风吹(366017990) 02:50:14
要等到另外一个变量B不再指向他的时候,才能对这个空间进行回收操作
撕开内裤任风吹(366017990) 02:50:25
不然任何时候使用b都会出错
f l U x(13707980) 02:50:28
那么是不是要Set B=null
撕开内裤任风吹(366017990) 02:50:33
yes
撕开内裤任风吹(366017990) 02:50:44
这里引入另外一个问题
撕开内裤任风吹(366017990) 02:50:59
他是如何知道某个空间被其他的变量指向的呢?
f l U x(13707980) 02:51:18
问得好!鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌
撕开内裤任风吹(366017990) 02:51:29
玻璃渣用了一个很简单的原理
每次 设置A=某单位 的时候
撕开内裤任风吹(366017990) 02:51:47
给这个空间的“引用计数器”+1
撕开内裤任风吹(366017990) 02:52:34
每次 设置A不=某单位 的时候(包括set a= null或者set a = 某某单位),“引用计数器”-1
撕开内裤任风吹(366017990) 02:53:07
这样,玻璃渣认为:他们每次都可以“正确地”得知某个空间是否“可回收”
撕开内裤任风吹(366017990) 02:53:36
当然,一个空间初始化的时候(第一次被用到)这个值=0
撕开内裤任风吹(366017990) 02:54:22
那么
设置A=某单位
设置B=某单位
删除A
这里,“某单位”空间的“引用计数”等于多少呢?
f l U x(13707980) 02:54:54
1
撕开内裤任风吹(366017990) 02:55:02
正确。
撕开内裤任风吹(366017990) 02:56:00
如果
function xxxx takes nothing returns nothing
设置A=某单位
设置B=某单位
删除A
endfunction
就会造成该空间被泄露,而且是不可回复的
f l U x(13707980) 02:56:49
嗯...
f l U x(13707980) 02:56:56
我想问个问题...
f l U x(13707980) 02:59:16
set tr1 = CreateTrigger()
是吧这个新建的Trigger的引用计数器设为1了对吧?
然后我们紧接着set tr1 = null
那么就把Trigger的引用计数器-1
变成0
难道这样会导致这个触发失效?
- -总觉得这个问题比较傻
f l U x(13707980) 02:59:37
或者是
f l U x(13707980) 02:59:47
只有Destroy以后
才会回收?
f l U x(13707980) 03:00:01
就像单位的“删除”一样?
撕开内裤任风吹(366017990) 03:01:33
只是把那个空间的“计数器”设置-1
撕开内裤任风吹(366017990) 03:01:50
这样在“删除”以后他会自己把空间回收掉
f l U x(13707980) 03:02:01
- -哦!
撕开内裤任风吹(366017990) 03:04:17
当然他指不定什么时候回收,只要这个空间被“删除”过而且引用计数=0就可以回收
SqlInjection(824674478) 03:05:06
恩,还有比较关心的是那些类型变量占用的空间大,
泄漏导致的问题严重。
撕开内裤任风吹(366017990) 03:07:21
一般就单位最大
撕开内裤任风吹(366017990) 03:08:04
反正防止泄露的意思就是让你在删除后保证他的引用计数器=0
SqlInjection(824674478) 03:10:30
基本理解了=。=
还有个问题,泄漏这个东西具体影响如何?很严重么?
不过貌似市面上的地图99%没处理过这个问题。。。
撕开内裤任风吹(366017990) 03:10:50
当然,只有“指针”型才会泄露
撕开内裤任风吹(366017990) 03:11:09
不会泄露的变量有:integer,real,boolean
撕开内裤任风吹(366017990) 03:11:15
其他都是指针
撕开内裤任风吹(366017990) 03:12:49
泄漏的具体影响在小函数里面体现的非常明显
SqlInjection(824674478) 03:13:04
额,什么叫“小”函数?
撕开内裤任风吹(366017990) 03:14:08
比如
function Location_EX takes real x,real y returns location
local location p = Location(x,y)
return p
endfunction
撕开内裤任风吹(366017990) 03:14:34
就那种非常容易被执行,而且每次都是新申请存储单元的函数
aeris(417214250) 17:24:40
handle和对象泄漏是不同的
aeris(417214250) 17:25:08
如果我这样写
local location loc = Location(0, 0)
之后什么也不处理
aeris(417214250) 17:25:16
那么有两个东西泄漏了
aeris(417214250) 17:25:40
1.location对象本身
2.这个对象的handle
aeris(417214250) 17:26:07
所以清除要两步
aeris(417214250) 17:26:26
1.call RemoveLocation(loc)
这里删除location对象
aeris(417214250) 17:26:47
2.set loc = null
减少handle的引用计数
aeris(417214250) 17:27:02
让handle能回收再利用
-----------------------------------------------------------------------------------------------------
话说这段QQ记录看完了基本就能明白大概了 |
|