找回密码
 点一下
查看: 6221|回复: 32

GetSpellTargetLoc返回的点该不该释放 (已解决)

[复制链接]
发表于 2006-3-31 19:04:29 | 显示全部楼层 |阅读模式
GetSpellTargetLoc也得释放?


是否所有返回handle类型(及其子类型)的函数都得释放?


========== 最开始的问题 ==========

先看看GetUnitLoc的定义:

  1. constant native GetUnitLoc takes unit whichUnit returns location
复制代码

带有constant,应该是不需要释放的

但经illlusion兄的提醒
发现反复调用GetUnitLoc也会占用内存,似乎创建了新的点
我自己也测试了一下,发现果然如此


极其迷惑
所以跑到这来问诸位达人:
这到底是怎么一回事?
GetUnitLoc返回的点该不该释放?
constant到底是什么意思?
怎么判断什么东西需要释放?

[ 本帖最后由 zyl910 于 2006-4-24 01:00 编辑 ]
发表于 2006-3-31 19:11:11 | 显示全部楼层
constant 意思是返回的结果不许被改变,还是要remove的
回复

使用道具 举报

 楼主| 发表于 2006-3-31 19:26:10 | 显示全部楼层
原来如此

哪儿有详尽点的Jass语法参考
注意是语法参考,不是库函数参考
回复

使用道具 举报

 楼主| 发表于 2006-3-31 19:33:43 | 显示全部楼层
照这样说
GetSpellTargetLoc也得释放?
看来绝大多数写T技能的人都没释放


  1. constant native GetSpellTargetLoc           takes nothing returns location
复制代码
回复

使用道具 举报

麦德三世A 该用户已被删除
发表于 2006-3-31 19:35:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2006-3-31 19:38:16 | 显示全部楼层
有没有人回答我4楼的问题


GetSpellTargetLoc也得释放?


是否所有返回handle类型(及其子类型)的函数都得释放?
回复

使用道具 举报

发表于 2006-3-31 19:50:35 | 显示全部楼层
GetSpellTargetLoc也得释放

但是并非所有返回handle类型(及其子类型)的函数都得释放,比如playercolor就是Handle的子类型,就不用释放.而类似Trackable的想释放也释放不了
回复

使用道具 举报

 楼主| 发表于 2006-3-31 19:55:23 | 显示全部楼层
playercolor不需释放?

那么这个函数呢:

  1. native GetPlayerColor takes player whichPlayer returns playercolor
复制代码


只不过playercolor也属于那种想释放也释放不了


看来是这样:
凡是有释放函数的,都得释放
凡是没释放函数的,想释放也释放不了,尽量多用全局变量存储
凡是Blizzard.j的变量,不能释放

[ 本帖最后由 zyl910 于 2006-3-31 19:59 编辑 ]
回复

使用道具 举报

发表于 2006-3-31 20:01:42 | 显示全部楼层
playercolor确实不必释放,因为playercolor其实就是把handle当作integer来存放整数的.
利用H2I可以看到,其实GetPlayerColor()返回的就是玩家编号(1-15),2位的整数而已


呃,我没有说Blizzard.j的不用释放啊,BJ的只是有一部分不用释放而已

[ 本帖最后由 麦德三世B 于 2006-3-31 20:02 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2006-3-31 20:05:02 | 显示全部楼层
原帖由 麦德三世B 于 2006-3-31 20:01 发表
呃,我没有说Blizzard.j的不用释放啊,BJ的只是有一部分不用释放而已



不明白?

难道BJ中定义的全局变量都得释放?
回复

使用道具 举报

发表于 2006-3-31 20:09:32 | 显示全部楼层
BJ中定义的所有Last X\'d vars系列的都是制图者万欲除之而后快地
如bj_lastCreatedTextTag bj_lastStartedTimer等等
回复

使用道具 举报

 楼主| 发表于 2006-3-31 20:15:03 | 显示全部楼层

我还以为你说的是bj_mapInitialPlayableArea

但是对于bj_lastCreatedTextTag这类东西
应该不需要remove
用变量存储后,将其设为null就行了吧
回复

使用道具 举报

 楼主| 发表于 2006-3-31 20:23:29 | 显示全部楼层
还有一个小问题

是不是所有带Convert函数的数据类型都跟playercolor一样?
回复

使用道具 举报

发表于 2006-3-31 20:25:50 | 显示全部楼层
如果到头来REMOVE掉那个\"用来存储的变量\",那和直接REMOVE掉bj_lastCreatedTextTag其实是一样.

其实说到\"释放变量\"这个用词其实不妥,所以才会造成误解.因为所有的handle其实都只是储存一串数字而已.
要移除的仅仅是该串数字所代表的一个对象而已(象playercolor不代表任何实际对象,因此不需要移除,高兴的话设成null就好).变量本身其实不会造成内存泄露恩恩(因为全是整数,占用内存不会很大).



我要说明的是,我在整个帖子里说的全是我的一家之言,是我自己的总结和理解,没有什么权威依据.如果有疑问最好还是亲力试验的好
回复

使用道具 举报

发表于 2006-3-31 20:32:11 | 显示全部楼层
呃,脑海里匆匆回顾了下我的语文.才想起我的\"一家之言\"这个成语用错了.

其实我的意思更接近与\"一面之辞\"





实践才是检验真理的唯一标准恩恩.期待楼主的研究文
回复

使用道具 举报

发表于 2006-3-31 20:33:15 | 显示全部楼层
理解麦德-三式-B型马甲滴发言...
但是偶没有办法表达出来..
回复

使用道具 举报

 楼主| 发表于 2006-3-31 20:34:04 | 显示全部楼层
我大概明白Jass解释器为什么不会在函数返回时自动释放局部变量了
就是因为存在像playercolor那样的、不是一个指针的数据类型

[ 本帖最后由 zyl910 于 2006-3-31 20:38 编辑 ]
回复

使用道具 举报

发表于 2006-3-31 20:40:47 | 显示全部楼层
简单的理解???
凡是你认为在内存中用4个字节不够保存的类型都要Remove...
回复

使用道具 举报

发表于 2006-3-31 20:43:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2006-3-31 20:45:09 | 显示全部楼层
原帖由 白银の游戏王 于 2006-3-31 20:40 发表
简单的理解???
凡是你认为在内存中用4个字节不够保存的类型都要Remove...


的确
我一直想找到释放string的函数
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 18:18 , Processed in 0.052713 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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