找回密码
 点一下
查看: 1627|回复: 6

JASS老手进[自定义函数泄露问题](结束了!)

[复制链接]
发表于 2010-12-21 19:33:36 | 显示全部楼层 |阅读模式
有一个疑问

如果一个自定义函数

有local location p1

中间是其他动作

最后  return p1
就是返回值是点类型

而我们防止泄露是 用 call RemoveLocation(p1)  与  set p1=null  这2句不能用在return 前面  否则 返回不了

而在后面又  因为 return语句的特殊性  直接略过了  那应该怎么办呢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


最终我还是选择了不用那个函数  用全局变量  不是我的习惯    至于用实数   因为我是  许多随即点的制作   所以也不适合  还是直接在用的函数里加了点代码就可以了
发表于 2010-12-21 19:48:35 | 显示全部楼层
申请个全局变量,比如Loc

在自定义函数的最后将p1赋值给Loc,然后set p1=null  ,return Loc

再在接受回传的函数里面调用RemoveLocation()。
回复

使用道具 举报

 楼主| 发表于 2010-12-21 20:48:21 | 显示全部楼层

回 1楼(cccty1l) 的帖子

我还有个疑问  你的回答我是看懂了

我本来的函数是  
local location p1
local location p2
中间一段内容

set p2=p1
call RemoveLocation(p1)
set p1=null
return p2

按理来说 只不过是p2有泄露 咱暂且不管
但是返回的点 竟然是空的 或者说 是没有的   
为什么   
既然这样不行 我还担忧   楼上的方法 会不会也不行
回复

使用道具 举报

发表于 2010-12-21 21:00:05 | 显示全部楼层
[codes=jass]
globals
  location Loc
endglobals

function aaa takes nothing returns location
local location p1

中间一段内容

set Loc=p1
set p1=null
return Loc
endfunction

function bbb takes nothing returns boolean
local location newloc=aaa()

中间一段内容

call RemoveLocation(newloc)
set newloc=null
return flase
endfunction
[/codes]

大概就是这样的用法吧。
更灵活的用法可以在这个基础上延伸,比如不需要函数aaa()再返回点,而是直接用Loc记录,或者是通过数组记录下两个实数来代替点,等等。
回复

使用道具 举报

 楼主| 发表于 2010-12-21 21:19:59 | 显示全部楼层
引用第3楼cccty1l于2010-12-21 21:00发表的 :
[codes=jass]
globals
  location Loc
endglobals

.......



我知道了  函数aaa里是不能把那个点删除的 否则就是  那个  对象点 没了  传递也没意义了吧
回复

使用道具 举报

发表于 2010-12-21 21:31:26 | 显示全部楼层
对,而且也不能return 一个局部变量,因为会造成泄露。
回复

使用道具 举报

发表于 2010-12-21 22:00:40 | 显示全部楼层
可以用参数来返回,多用一个参数就行了。调用时用null,返回是返回参数……
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 14:38 , Processed in 0.031749 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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