免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4773 | 回复: 4
打印 上一主题 下一主题

讲讲undef 和内存释放 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-17 13:26 |只看该作者 |倒序浏览
本帖最后由 climby 于 2012-07-17 13:51 编辑

有人问到了undef %hash 是不是释放哈希表的内存。 答案:不是。
刚好就这个问题随便聊聊undef 和内存释放。

一般来说,变量的内存是直到超出变量范围才会释放的. 在变量范围内清除一个变量内容,只会让你感觉到"似乎"获得了一个新的变量. 当变量超出范围后,如果有任何原因阻止内存释放(例如,还有一些引用指向该变量),该变量将会变成匿名变量,系统将会分配一个全新的变量.
基于以上的原因, undef %hash 并不是释放内存, 只是清除%hahs变量的内容,只不过undef 不仅仅是清除变量内容,而且释放了变量的buffers.
以下是清除一个变量内容的方法:
  1.   
  2. $s = undef
  3. @a = ();
  4. %h = ()
复制代码
单纯的清除变量内容,并不是直接释放内存, 变量的buffer只是被标记了unused, 但还是保存了内存分配,为以后使用.
  
undef 函数也可以用来清除一个变量内容

  1. undef $s
  2. undef @b
  3. undef %h
复制代码
只不过 undef 除了清除变量内容以外,还清除了变量的buffers.  

有例为证:

  1. ========================

  2. perl -MDevel::Peek -e'
  3.      $s = "abc"; Dump $s;
  4.      $s = undef; Dump $s;
  5.      undef $s;   Dump $s; '
  6.   
  7. ========================
  8. SV = PV(0x1e5dc20) at 0x1e7dac8
  9.    REFCNT = 1
  10.    FLAGS = (POK,pPOK)      <--  变量中保存一个字符串
  11.    PV = 0x1e76d00 "abc"\0
  12.    CUR = 3
  13.    LEN = 16
  14. SV = PV(0x1e5dc20) at 0x1e7dac8
  15.    REFCNT = 1
  16.    FLAGS = ()                    <-- 变量内容被清除了
  17.    PV = 0x1e76d00 "abc"\0        <-- 变量的buffer仍在
  18.    CUR = 3
  19.    LEN = 16
  20. SV = PV(0x1e5dc20) at 0x1e7dac8
  21.    REFCNT = 1
  22.    FLAGS = ()               <--   变量内容被清除了
  23.    PV = 0                   <--   变量的buffer也被清除了
  24. ========================
复制代码
有此看来, undef 函数的作用其实非常有限,因为大多数场合上,仅仅清除变量的内容就足够了。
  
[ THE END ]  

论坛徽章:
3
2015亚冠之阿尔希拉尔
日期:2015-08-15 16:33:2215-16赛季CBA联赛之四川
日期:2016-01-03 13:37:0515-16赛季CBA联赛之四川
日期:2016-06-13 15:53:36
2 [报告]
发表于 2012-07-17 14:31 |只看该作者
那么请问楼主,如何能用perl对内存进行释放呢?因为对不用%hash变量进行清除,而且还需要释放给程序其它变量使用,程序提示内存溢出(程序本身没有错误)。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
3 [报告]
发表于 2012-07-17 14:33 |只看该作者
刚学 perl 不久,谢谢楼主分享!

论坛徽章:
0
4 [报告]
发表于 2012-07-17 16:12 |只看该作者
回复 2# minirain

内存释放发生在超出变量范围,并且没有其他对变量的引用的时候。
例如:

  1. my %hash;
  2. ...

复制代码
这样 %hash 变量范围就是整个文件,要到文件结束后才可能释放内存的。

换一种


  1. my $s;
  2. {
  3.   my %hash;
  4.   ...
  5. }
  6. # 此时已经超出%hash的变量范围, 如果没有其他地方对%hash有引用, 理论上此处就会释放掉%hash内存,其他变量就可以使用释放后的内存了。
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-07-18 00:17 |只看该作者
学习了~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP