- 论坛徽章:
- 0
|
本帖最后由 climby 于 2012-07-17 13:51 编辑
有人问到了undef %hash 是不是释放哈希表的内存。 答案:不是。
刚好就这个问题随便聊聊undef 和内存释放。
一般来说,变量的内存是直到超出变量范围才会释放的. 在变量范围内清除一个变量内容,只会让你感觉到"似乎"获得了一个新的变量. 当变量超出范围后,如果有任何原因阻止内存释放(例如,还有一些引用指向该变量),该变量将会变成匿名变量,系统将会分配一个全新的变量.
基于以上的原因, undef %hash 并不是释放内存, 只是清除%hahs变量的内容,只不过undef 不仅仅是清除变量内容,而且释放了变量的buffers.
以下是清除一个变量内容的方法:-
- $s = undef
- @a = ();
- %h = ()
复制代码 单纯的清除变量内容,并不是直接释放内存, 变量的buffer只是被标记了unused, 但还是保存了内存分配,为以后使用.
undef 函数也可以用来清除一个变量内容-
- undef $s
- undef @b
- undef %h
复制代码 只不过 undef 除了清除变量内容以外,还清除了变量的buffers.
有例为证:
- ========================
- perl -MDevel::Peek -e'
- $s = "abc"; Dump $s;
- $s = undef; Dump $s;
- undef $s; Dump $s; '
-
- ========================
- SV = PV(0x1e5dc20) at 0x1e7dac8
- REFCNT = 1
- FLAGS = (POK,pPOK) <-- 变量中保存一个字符串
- PV = 0x1e76d00 "abc"\0
- CUR = 3
- LEN = 16
- SV = PV(0x1e5dc20) at 0x1e7dac8
- REFCNT = 1
- FLAGS = () <-- 变量内容被清除了
- PV = 0x1e76d00 "abc"\0 <-- 变量的buffer仍在
- CUR = 3
- LEN = 16
- SV = PV(0x1e5dc20) at 0x1e7dac8
- REFCNT = 1
- FLAGS = () <-- 变量内容被清除了
- PV = 0 <-- 变量的buffer也被清除了
- ========================
复制代码 有此看来, undef 函数的作用其实非常有限,因为大多数场合上,仅仅清除变量的内容就足够了。
[ THE END ] |
|