魔兽中每个具体的东西都占用着分配的一片内存,内存里这片地方的编号就是我们用UnionBug得到的整数。暂称为handle值吧。
假设游戏运行中,整个游戏只有很简单的几个东西:
单位变量 u 指向1048861的地址
单位变量 u2 指向1048861的地址
点变量 p 指向1048862的地址
单位 类型:步兵 handle值1048861 被2个变量连接(u,u2)
点 handle值1048862 被1个变量连接(p)
单位 类型:大法师 handle值1048863 被0个变量连接
我们调用:
单位 - 删除 u
系统找到变量u所代表的单位,读取u所指向的1048861的地址~那个步兵~
好吧,系统找出1048861的地址,清除相应的内存区域并更新游戏。游戏变成:
单位变量 u 指向1048861的地址
单位变量 u2 指向1048861的地址
点变量 p 指向1048862的地址
空 handle值1048861 被2个变量连接(u,u2)
点 handle值1048862 被1个变量连接(p)
单位 类型:大法师 handle值1048863 被0个变量连接
可以看到,1048861的地址已经变为空了,不过u,u2仍连结着1048861。
然后,我们再:
设置 u = (新建 玩家1(红色) 的 骑士 在 p ,面向角度:0.00 度)
这条动作是分2个部分的:
创建1个骑士在p
系统先找到p所代表的点~
然后呢~要在内存中寻找一个能放下东西的空地方-系统找到了编号为1048864的区域:
单位变量 u 指向1048861的地址
单位变量 u2 指向1048861的地址
点变量 p 指向1048862的地址
空 handle值1048861 被2个变量连接(u,u2)
点 handle值1048862 被1个变量连接(p)
单位 类型:大法师 handle值1048863 被0个变量连接
单位 类型:骑士 handle值1048864 被0个变量连接
现在我们再来执行动作的下半部分:
设置u=刚才创建的骑士
之前已经知道了骑士的handle值是1048864,那么就把u指向1048864就好~
单位变量 u 指向1048864的地址
单位变量 u2 指向1048861的地址
点变量 p 指向1048862的地址
空 handle值1048861 被1个变量连接(u2)
点 handle值1048862 被1个变量连接(p)
单位 类型:大法师 handle值1048863 被0个变量连接
单位 类型:骑士 handle值1048864 被1个变量连接(u)
但1048861的地址也是空的,为什么不建立在1048861呢~?
就在于 被1个变量连接(u2) 这一项
1048861原先是一个步兵,我们可以通过变量u2来对他作动作
之后他被删除,于是1048861变成了空,但u2仍是连结在1048861的位置。
如果我们把骑士创建在1048861的位置,那么变量u2在我们没有手动设定的情况下就突然从步兵变成了骑士,显然不合逻辑。
所以暴雪设定一个位置只要有变量连接就不能被占。
变量连接数可以看作是像自定义值一样的绑定在每个handle地址上的整数变量。
设置某变量=某handle地址 时,把该handle地址的变量连接数+1,同时把变量原来指向的handle地址的变量连接数-1
只有满足地址所装东西为空和变量连接数为0两个条件才可以被系统重复利用。
我们在触发中声明一个单位局部变量并连到某单位:单位handle地址的变量连接数+1,在触发结束后局部变量被系统清除了,但单位的handle地址的变量连接数却不会自动-1。。。于是这个地址不能再被利用了,即使单位死后消失。
所以就成了泄漏。。。
关于全局变量不set null的泄漏,不太了解。。。
能知道的是,全局变量不set null的泄漏有2部分。
第一部分,如果我们把1个单位变量指向1个单位,然后删除之。但这个变量仍指向原单位的地址,这个地址在变量指向另一个单位之前就是不可使用的,所以算是泄漏了。但这种"泄漏"是暂时的,与局部变量有本质的区别,想也知道几个全局变量能占多少位置,所以我更愿意把这一部分排除出泄漏的范畴。
第二部分就很诡异了。。。来源未知,原因不明。。。不知道- -
http://we.wechn.com/好像是老狼的教程,他是不是想说明 全局变量不用理他??
|