找回密码
 点一下
查看: 2043|回复: 12

内存泄漏是怎么来的~~~

[复制链接]
发表于 2008-8-26 06:55:42 | 显示全部楼层 |阅读模式
话说本人也懂一点排泄
不过仍然很疑惑
内存泄漏是怎么来的~~~
请高手们指教啊~~~~~
发表于 2008-8-26 06:58:23 | 显示全部楼层
请先搜索
谢谢合作

内存泄漏本来就是编程中的概念
用到War3中也无不妥
用过VC++的人就知道内存泄漏是怎么回事了
像最近的Java和最新的.Net架构貌似都提供了垃圾回收装置解决一定的内存泄漏问题(虽然可能会带来额外开销,但是这是值得的~)
回复

使用道具 举报

 楼主| 发表于 2008-8-26 07:00:59 | 显示全部楼层
。。。。。。其实本人是问在魔兽中内存泄漏是怎么来的。。。。。。
至于搜索,请问有几个人会去看用户手册?这是人的心理,也是客观规律,不是吗?
问人很方便很好很强大,也许努力自学才能成为一流高手
但我们大多数人根本不想成为高手
只是为了做图的乐趣 凭借兴趣使用
仅此而已(这还不够吗?难道所有人都有时间和精力去努力成为高手吗?)来这个论坛也只是为了解决一些问题 也不一定是为了成为高手
问论坛上的十个人
九个人这么回答
回复

使用道具 举报

发表于 2008-8-26 07:07:24 | 显示全部楼层
字很多……很难得……
但是这些问题以前已经提过了 为了不加重大家的负担 就请搜索
我先走了
回复

使用道具 举报

发表于 2008-8-26 08:20:13 | 显示全部楼层
引用第2楼dk000于2008-08-26 07:00发表的  :
。。。。。。其实本人是问在魔兽中内存泄漏是怎么来的。。。。。。
至于搜索,请问有几个人会去看用户手册?这是人的心理,也是客观规律,不是吗?
问人很方便很好很强大,也许努力自学才能成为一流高手
但我们大多数人根本不想成为高手
只是为了做图的乐趣 凭借兴趣使用
.......

如果仅是为了乐趣和使用,你完全没必要问这个问题,有人告诉你WE怎么用就行了,一旦问出“怎么来的”就将问题上升了一个高度,没有自学的觉悟是不行的

所以我给楼主两个选择
1,你自己去看教程
2,我锁帖(封ID也行)
回复

使用道具 举报

发表于 2008-8-26 12:38:28 | 显示全部楼层
WE里的内存泄漏,其实就是你创建了某个对象,用了之后没有删除他
比如你创建了一个单位辅助你放技能,但是没有设置生命倒计时条,那个单位的生命回复也不是负数,不会自动死亡,放完了之后就再也没有理他,他就一直停留在地图中。每次都这样创建一个单位而不清除,就会加重地图负担。
当然,不止单位,很多变量都会占用内存,最常见的就是单位组和点。
回复

使用道具 举报

发表于 2008-8-26 14:46:56 | 显示全部楼层
简单的说就是创建了无限数量类型的handle没清理
回复

使用道具 举报

发表于 2008-8-26 23:08:32 | 显示全部楼层
内存泄漏? 学做地图,逻辑思维能力好,做地图会相对简单,理科的长项。

我可以说说《点》泄漏,不一定完全正确,纯属我个人观点

在魔兽中每个士兵或建筑在诞生,会创建一个点,

当其移动时,点也移动,当其死亡时,点也会被系统删除,

点代表其位置,没有了这个点,也就没了这个物体,

在WE中一个个的放进去的单位,以及造出来的单位,系统会生成一个个点,系统可以自动删除

但是触发器创建的点,是凭空产生的,不是系统生成的,这个点靠系统是删除不掉的

假设你给玩家1 五个农民在( <区域1>  的中心 ),系统放置这五个农民时会在( <区域1>  的中心 )生成1个点

但是一共出了五个农民,就又需要5个点,于是系统会在( <区域1>  的中心 )的那个点旁边 再生成5个点

这就多了1个点,就是内存泄漏中的  《点》泄漏

这个点必须在触发完成后删除,才能保证地图不会产生《点》泄漏

当然,《点》泄漏  可不止这一种,其余的我也不知道
回复

使用道具 举报

发表于 2008-8-26 23:13:26 | 显示全部楼层
高手也来看看我说的对不 对啊

以上是我个人理解,希望是正确答案


————————————————————

坚决不3连帖,不给版主扣分机会  ~_~  ~_~  ~_~
回复

使用道具 举报

发表于 2008-8-27 00:06:05 | 显示全部楼层
LS连点是什么都没搞清楚
回复

使用道具 举报

发表于 2008-8-27 00:08:53 | 显示全部楼层
war3的内存泄露来自类型为handle的变量。

handle实际只是一个整数变量,但它却能保存很多信息,比如unit里面包含有单位的位置,单位的技能,单位的属性......显然单靠一个整数变量是无法保存这么多信息的,那war3是如何做到的呢?事实上,handle的值可以认为只是一个数组的下标,具体的信息是保存其他位置的,handle的值只是告诉war3这些保存这些信息的位置。

回到正题上来,显然每个变量都是要占用内存的,当你新建一个变量时war3就会分配一块内存给这个变量,当这个变量不用时(局部变量在函数结束时回收),war3就会把属于这个变量的内存回收,供其他用途使用。考虑一下,如果war3不会回收内存,那么内存的消耗只会增不会减,再多的内存也会有用完的时候。所以当我们不用handle的变量时,war3会把handle这段内存回收了,但另一段内存(就是上面说的那段)war3不会自动回收。这段内容可以说是隐藏的,只能通过handle来找到它,但handle已经被war3给删了,也就是再也没办法找到它了,无法删除,也无法使用,这段内存就会被浪费掉,这就是内存泄露。


我已经尽量通俗了...能理解就理解吧


顺便说下,如果你看明白上面的内容,就该知道内存泄露的后果就是浪费内存,使内存消耗增大,内存消耗增大可以说是对速度的影响是很小的。经常有人说内存泄露会严重拖慢速度,其实是另有原因的...说起来又会是一大篇,而且更难理解...
回复

使用道具 举报

发表于 2008-8-27 00:11:05 | 显示全部楼层
LS就不能委婉点说……
---------------------------免费赠送上我当年学泄漏的原版教材给LZ吧-------------------------------
撕开内裤任风吹(366017990) 02:43:50
那,问大家一个常识性问题
撕开内裤任风吹(366017990) 02:44:08
如果我希望对某个特定单位进行操作n次,应该怎么般呢

撕开内裤任风吹(366017990) 02:44:27
比如对他造成5次伤害,每次间隔1秒
撕开内裤任风吹(366017990) 02:44:34
数值随意
SqlInjection(824674478) 02:44:42
循环5次。。。
撕开内裤任风吹(366017990) 02:45:27
标准的做法是
设置变量A=某单位
循环开始
等待
OOXX
结束循环
  f l U x(13707980) 02:45:36

撕开内裤任风吹(366017990) 02:45:40
其中OOXX都是对A进行操作
撕开内裤任风吹(366017990) 02:45:52
那么这个"A"到底代表什么呢?
撕开内裤任风吹(366017990) 02:46:16
实际上“某单位”是有一个存储空间的
  f l U x(13707980) 02:46:29
是一个指针?指向那个空间?
撕开内裤任风吹(366017990) 02:46:43
这个A只是一个用来标记指向那个“某单位”空间的东西
撕开内裤任风吹(366017990) 02:47:28
如果
设置A=某单位
设置B=某单位
删除A

那么会发生什么事情呢?
  f l U x(13707980) 02:47:47
b没用了...
撕开内裤任风吹(366017990) 02:48:02
正确。
SqlInjection(824674478) 02:48:05

撕开内裤任风吹(366017990) 02:48:25
但是b仍然是一个标记,而且还是指向那个“某单位”的空间
撕开内裤任风吹(366017990) 02:48:56
删除A只是把A指向的那个空间标记为“可回收”
撕开内裤任风吹(366017990) 02:49:09
注意:仅仅是“可回收”
撕开内裤任风吹(366017990) 02:49:37
由于还有另外一个东西指向他,所以这个空间并没有被马上回收
撕开内裤任风吹(366017990) 02:50:14
要等到另外一个变量B不再指向他的时候,才能对这个空间进行回收操作
撕开内裤任风吹(366017990) 02:50:25
不然任何时候使用b都会出错
  f l U x(13707980) 02:50:28
那么是不是要Set B=null
撕开内裤任风吹(366017990) 02:50:33
yes
撕开内裤任风吹(366017990) 02:50:44
这里引入另外一个问题
撕开内裤任风吹(366017990) 02:50:59
他是如何知道某个空间被其他的变量指向的呢?
  f l U x(13707980) 02:51:18
问得好!鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌鼓掌
撕开内裤任风吹(366017990) 02:51:29
玻璃渣用了一个很简单的原理
每次 设置A=某单位 的时候
撕开内裤任风吹(366017990) 02:51:47
给这个空间的“引用计数器”+1
撕开内裤任风吹(366017990) 02:52:34
每次 设置A不=某单位 的时候(包括set a= null或者set a = 某某单位),“引用计数器”-1
撕开内裤任风吹(366017990) 02:53:07
这样,玻璃渣认为:他们每次都可以“正确地”得知某个空间是否“可回收”
撕开内裤任风吹(366017990) 02:53:36
当然,一个空间初始化的时候(第一次被用到)这个值=0
撕开内裤任风吹(366017990) 02:54:22
那么
设置A=某单位
设置B=某单位
删除A

这里,“某单位”空间的“引用计数”等于多少呢?
  f l U x(13707980) 02:54:54
1
撕开内裤任风吹(366017990) 02:55:02
正确。
撕开内裤任风吹(366017990) 02:56:00
如果
function xxxx takes nothing returns nothing
设置A=某单位
设置B=某单位
删除A
endfunction

就会造成该空间被泄露,而且是不可回复的
  f l U x(13707980) 02:56:49
嗯...
  f l U x(13707980) 02:56:56
我想问个问题...
  f l U x(13707980) 02:59:16
set tr1 = CreateTrigger()
是吧这个新建的Trigger的引用计数器设为1了对吧?
然后我们紧接着set tr1 = null
那么就把Trigger的引用计数器-1
变成0
难道这样会导致这个触发失效?

- -总觉得这个问题比较傻
  f l U x(13707980) 02:59:37
或者是
  f l U x(13707980) 02:59:47
只有Destroy以后
才会回收?
  f l U x(13707980) 03:00:01
就像单位的“删除”一样?
撕开内裤任风吹(366017990) 03:01:33
只是把那个空间的“计数器”设置-1
撕开内裤任风吹(366017990) 03:01:50
这样在“删除”以后他会自己把空间回收掉
  f l U x(13707980) 03:02:01
- -哦!
撕开内裤任风吹(366017990) 03:04:17
当然他指不定什么时候回收,只要这个空间被“删除”过而且引用计数=0就可以回收
SqlInjection(824674478) 03:05:06
恩,还有比较关心的是那些类型变量占用的空间大,
泄漏导致的问题严重。
撕开内裤任风吹(366017990) 03:07:21
一般就单位最大
撕开内裤任风吹(366017990) 03:08:04
反正防止泄露的意思就是让你在删除后保证他的引用计数器=0
SqlInjection(824674478) 03:10:30
基本理解了=。=

还有个问题,泄漏这个东西具体影响如何?很严重么?
不过貌似市面上的地图99%没处理过这个问题。。。
撕开内裤任风吹(366017990) 03:10:50
当然,只有“指针”型才会泄露
撕开内裤任风吹(366017990) 03:11:09
不会泄露的变量有:integer,real,boolean
撕开内裤任风吹(366017990) 03:11:15
其他都是指针
撕开内裤任风吹(366017990) 03:12:49
泄漏的具体影响在小函数里面体现的非常明显
SqlInjection(824674478) 03:13:04
额,什么叫“小”函数?
撕开内裤任风吹(366017990) 03:14:08
比如
function Location_EX takes real x,real y returns location
    local location p = Location(x,y)
    return p
endfunction
撕开内裤任风吹(366017990) 03:14:34
就那种非常容易被执行,而且每次都是新申请存储单元的函数

aeris(417214250) 17:24:40
handle和对象泄漏是不同的
aeris(417214250) 17:25:08
如果我这样写
local location loc = Location(0, 0)
之后什么也不处理
aeris(417214250) 17:25:16
那么有两个东西泄漏了
aeris(417214250) 17:25:40
1.location对象本身
2.这个对象的handle
aeris(417214250) 17:26:07
所以清除要两步
aeris(417214250) 17:26:26
1.call RemoveLocation(loc)
这里删除location对象
aeris(417214250) 17:26:47
2.set loc = null
减少handle的引用计数
aeris(417214250) 17:27:02
让handle能回收再利用
-----------------------------------------------------------------------------------------------------
话说这段QQ记录看完了基本就能明白大概了
回复

使用道具 举报

发表于 2008-8-27 11:08:35 | 显示全部楼层
ls还真够详尽的啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 20:52 , Processed in 0.066570 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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