找回密码
 点一下
查看: 2998|回复: 10

[疑问][已解决]string的使用

[复制链接]
发表于 2007-3-21 12:47:55 | 显示全部楼层 |阅读模式
看了一些文章,了解到string也是一种特殊的handle

同样有泄漏问题

但是其作用原理还有些疑惑,所以来求证下

question A:

处理一次

"AAA"+I2S(123)

是不是会生成一个"AAA"一个"123"和一个"AAA123",并且都无法释放

question B:

那如果单独使用stirng呢?

call AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",x1,y1)

其中的"Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl"是否会生成一个新的handle被引用呢?

如果是的话,我事先用全局变量储存这些string能否防止?

question C:

另外,如果需要用到"AAA"+I2S(123)这样的运算

我可不可以用

set udg_tempString1 = "AAA"
set udg_tempString2 = I2S(123)
set udg_tempString2 = udg_tempSrting1 + udg_tempString2

这样的方法来防止?
 楼主| 发表于 2007-3-21 12:52:46 | 显示全部楼层
又看了一遍

http://www.ourga.com/bbs/read.php?tid=2520&fpage=2

似乎同样的字符串,就不会再次占用内存,因为war3不会再次创建一个同样的字符串

而是直接引用string_handle_table里已存在的字符串?

我的理解正确么?
回复

使用道具 举报

发表于 2007-3-21 13:08:18 | 显示全部楼层
就算用变量存储也一样的~~字符串对象依然会出现~~
以上这些对象全都会出现~~
回复

使用道具 举报

 楼主| 发表于 2007-3-21 13:48:24 | 显示全部楼层
根据hackwaly的说法

处理字符串时,会现在内存中存入一个string,存在内存地址A

然后根据string生成的hash去索引string_handle_table

那么如果在table中找到了这个string,那么,就有一个地址B储存着一个相同的string,并且B可以在string_handle_table里被索引到,到了这里,返回的就是B的地址索引

那么,这时,地址A处的string会被销毁释放么?这点hackwaly那个帖子里就没有提到了
回复

使用道具 举报

发表于 2007-3-21 13:49:51 | 显示全部楼层
相同的字符串指向同一个对象~~因为string是以hash的形式存放的~~
回复

使用道具 举报

发表于 2007-3-21 13:57:59 | 显示全部楼层
楼主可以利用return bug来显示整个hash表~~不过要小心不要让自己显示在屏幕上的字符串成为hash中的新字符串~~这样会不断积累循环下去的~~
回复

使用道具 举报

 楼主| 发表于 2007-3-21 14:19:34 | 显示全部楼层
恩,这么说起来,所有同样的字符串都是一个对象

也就是说

call AddSpecialEffect("Abilities\\\\Spells\\\\Other\\\\Monsoon\\\\MonsoonBoltTarget.mdl",x1,y1)

无论这个语句运行多少次

都只会产生一个string对象,并且占用一份内存么?

ps:特效的泄漏先不管它……
回复

使用道具 举报

发表于 2007-3-21 14:32:12 | 显示全部楼层
嗯嗯~~是啊~~
回复

使用道具 举报

 楼主| 发表于 2007-3-21 16:34:20 | 显示全部楼层
恩恩……那就不管它了……让他漏去吧-__-!...

谢谢麦德3了……
回复

使用道具 举报

发表于 2007-3-22 13:10:46 | 显示全部楼层
对于string的泄漏可以说是无能为力的,只能尽量减少,不可能避免的

基本上尽量减少GameCache中类似 "FireBolt"+I2S(h2i(u)) 这种格式就行了
回复

使用道具 举报

发表于 2007-4-18 11:52:34 | 显示全部楼层
基本上~最好先用变量的方法来储存字符串。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 04:05 , Processed in 0.034079 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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