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

哪些handle不用set null呢?

[复制链接]
发表于 2008-6-4 19:51:10 | 显示全部楼层 |阅读模式
以前我都习惯全部set null
听某人说有些可以不用额
虽然知道这样的排泄效率上影响不大
但是还是想搞清楚
有人能告诉我下么
发表于 2008-6-4 20:24:36 | 显示全部楼层
我也习惯set null额………………
回复

使用道具 举报

发表于 2008-6-4 20:32:35 | 显示全部楼层
实际上set null就是为了把handle结构的引用记数清理掉,泄露也不过12字节,set null修改的是handle结构的一个成员而不是局部变量本身,这点很重要

至于什么时候需要set null,什么时候不需要么,可以这么考虑,当handle表中的一个12字节handle结构不需要释放,就是其地址不需要重复利用时,清理引用记数与否是没有关系的. 而会产生handle结构的只有那些Create语句,于是乎自己就应该想到那些不用释放了

例如:PLAYER,这东西相当于全局变量,你也不可能创造
或者某个在运行时通过局部变量创造的单位,在游戏运行中一直存在,那么这个局部是否set null都没有关系
回复

使用道具 举报

发表于 2008-6-12 20:33:28 | 显示全部楼层
如下函数调用,会显示这个点的Handle值不会变量,可以说,点都是在一个位置上产生的。
[codes=jass]
function test takes nothing returns nothing
       local location X=Location(0,0)
       local location Y=X

       call BJDebugMsg( H2S( X))
       //............
       call RemoveLocation(X)
       set X=null
       set Y=null
endfunction
[/codes]

而如果改成:
[codes=jass]
function test takes nothing returns nothing
       local location X=Location(0,0)
       local location Y=X

       call BJDebugMsg( H2S( X))
       //............
       call RemoveLocation(X)
       set X=null

endfunction
[/codes]

[codes=jass]
function test takes nothing returns nothing
       local location X=Location(0,0)
       local location Y=X

       call BJDebugMsg( H2S( X))
       //............
       call RemoveLocation(X)

       set Y=null
endfunction
[/codes]

[codes=jass]
function test takes nothing returns nothing
       local location X=Location(0,0)
       local location Y=X

       call BJDebugMsg( H2S( X))
       //............

       set X=null
       set Y=null
endfunction
[/codes]
这样,会发现点的Handle值是不一样的,比如是
103233280,10323281,10323282.。。。

这可以得到,一个Handle类型的数据,set null是把引用计数器减1,比如上面的X,Y引用到同一点,只有都set null后引用计数器才变为0。  而destroy是把这个数据结构清空。
当引用计数器被精0,结构被清空后,这个内存位置才可以被下一次新产生的点占据。
回复

使用道具 举报

 楼主| 发表于 2008-6-12 23:46:42 | 显示全部楼层
引用第3楼Traxex于2008-06-12 20:33发表的  :
如下函数调用,会显示这个点的Handle值不会变量,可以说,点都是在一个位置上产生的。
[codes=jass]
function test takes nothing returns nothing
       local location X=Location(0,0)
       local location Y=X
.......
看了你的说明
我决定以后不排泄了
反正没setnull都是做无用功...
回复

使用道具 举报

发表于 2008-6-13 00:54:48 | 显示全部楼层
引用第4楼hke于2008-06-12 23:46发表的  :

看了你的说明
我决定以后不排泄了
反正没setnull都是做无用功...
那不同呃,没set null只是那个空间不能用,但实际不占内存了,如果不排泄的话,变量所引用的空间本身占的空间很大
回复

使用道具 举报

发表于 2008-6-13 10:02:51 | 显示全部楼层
set null本来就只是清除12字节的泄露,如果你自己感觉建立的临时handle不多的话,不set null也确实泄露不了多少内存

set null与否都不会影响handle类型的结构实际占用空间,只要先销毁后那个地址的空间都可以重复利用,只是不set null的话,handle table会有一项不能用而已

等以后我在jass调试器里加上handle实际地址跟踪的功能就能一目了然了
回复

使用道具 举报

发表于 2008-6-13 11:03:11 | 显示全部楼层
其实表位项目过多不仅是内存占用问题~~还有查询效率问题~~
回复

使用道具 举报

 楼主| 发表于 2008-6-13 11:07:36 | 显示全部楼层
引用第6楼rahxephon于2008-06-13 10:02发表的  :
set null本来就只是清除12字节的泄露,如果你自己感觉建立的临时handle不多的话,不set null也确实泄露不了多少内存

set null与否都不会影响handle类型的结构实际占用空间,只要先销毁后那个地址的空间都可以重复利用,只是不set null的话,handle table会有一项不能用而已

等以后我在jass调试器里加上handle实际地址跟踪的功能就能一目了然了
不过朱朱和老狼都说
如果引用计数不清理的话
remove只是把实际内存清零了 照样不能被重复利用的
于是乎...
不set null的话remove也白做了
我想想如果魔兽是申请一大块内存的话(应该是吧) 这样说应该的没错
然后捏 有限个的handle不用set null而已
因为那个是不会被清除滴
回复

使用道具 举报

发表于 2008-6-13 11:12:38 | 显示全部楼层
内存地址我查看过,不set null的话也可以重复利用,至少当初我测试单位时是这样(除非我记错了),等有时间继续做JASS调试器时再仔细看下
回复

使用道具 举报

 楼主| 发表于 2008-6-13 11:14:50 | 显示全部楼层
引用第9楼rahxephon于2008-06-13 11:12发表的  :
内存地址我查看过,不set null的话也可以重复利用,至少当初我测试单位时是这样(除非我记错了),等有时间继续做JASS调试器时再仔细看下

仔细看看
顺便看看参数是handle会不会泄露
回复

使用道具 举报

发表于 2008-6-13 13:34:04 | 显示全部楼层
希望有谁能研究出  哪些必须set null的。。

因为libla说过。。    set null还有个问题。    就是加长了哈希表。  

这样会使return bug  不准确       所以现在我几乎不set null了。

但有个问题。    一只红狼以前在群里说过    不set null好像会泄露局部变量。

而我图中   将会有上百个0.0几秒的东西。     都泄露的话   该怎么办。  会卡死的。。。



顺便问个问题。   怎么弄掉F12这功能`
回复

使用道具 举报

发表于 2008-6-13 13:43:50 | 显示全部楼层
已经有人回答过了吧,貌似去不掉
回复

使用道具 举报

 楼主| 发表于 2008-6-13 15:52:56 | 显示全部楼层
引用第11楼苍木于2008-06-13 13:34发表的  :
希望有谁能研究出  哪些必须set null的。。

因为libla说过。。    set null还有个问题。    就是加长了哈希表。  

这样会使return bug  不准确       所以现在我几乎不set null了。
.......
上面不是说得很清楚了
数量无限的handle要set null
像player那些就不用了
另外老狼说浮动文字占位小 不set null也没事
回复

使用道具 举报

 楼主| 发表于 2008-6-13 15:57:15 | 显示全部楼层
使return bug  不准确
不可能吧...
回复

使用道具 举报

发表于 2008-6-13 16:10:38 | 显示全部楼层
我是看这里说的
http://www.islga.org/bbs/read.php?tid=7540&keyword=JASS%7CBUG
”使用return bug时把变量设置成null”-bug

在极少数情况下,设置一个变量(多数是计时器),而这个变量又被你连同return bug一起使用,会产生问题。它看起来像是重设了某对象的handle id。
解决此问题有很多方案:

不要把变量设置成null。这是最容易的方案,但会造成(轻微)内存泄漏。
回复

使用道具 举报

 楼主| 发表于 2008-6-13 16:16:35 | 显示全部楼层
引用第15楼libla于2008-06-13 16:10发表的  :
我是看这里说的
http://www.islga.org/bbs/read.php?tid=7540&keyword=JASS%7CBUG
他的意思应该是说用returnbug会造成内存泄露
因为return产生了一个handle
而这个handle是没办法set null的
所以不管怎么搞都泄露了
回复

使用道具 举报

 楼主| 发表于 2008-6-13 16:20:39 | 显示全部楼层
好像看错了...
问老狼去
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 09:26 , Processed in 0.032600 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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