undef $x
とは異なり$x = undef
ます。ガベージコレクションとメモリの解放の両方がトリガーされるという印象を受けましたが、そうで$x = undef
はないようです。
これは言語のバグですか?やって$x = undef
、それはメモリを解放するべきではありませんか?
undef $x
とは異なり$x = undef
ます。ガベージコレクションとメモリの解放の両方がトリガーされるという印象を受けましたが、そうで$x = undef
はないようです。
これは言語のバグですか?やって$x = undef
、それはメモリを解放するべきではありませんか?
いいえ、いいえ。Perl は、再度必要になる可能性のあるメモリを解放しないことで、メモリの使用量よりも速度を優先します。文字列バッファの割り当てを解除する場合は、 を使用しますundef $x;
。
$ perl -MDevel::Peek -e'
Dump($x);
$x='abc'; Dump($x);
$x=undef; Dump($x);
undef $x; Dump($x);
'
SV = NULL(0x0) at 0x1c39284 <-- No body allocated
REFCNT = 1
FLAGS = () <-- Undefined
SV = PV(0x3e8d54) at 0x1c39284 <-- PV body allocated
REFCNT = 1
FLAGS = (POK,pPOK) <-- Contains a string
PV = 0x3eae7c "abc"\0
CUR = 3
LEN = 12
SV = PV(0x3e8d54) at 0x1c39284 <-- PV body allocated
REFCNT = 1
FLAGS = () <-- Undefined
PV = 0x3eae7c "abc"\0 <-- Currently unused string buffer
CUR = 3
LEN = 12
SV = PV(0x3e8d54) at 0x1c39284 <-- PV body allocated
REFCNT = 1
FLAGS = () <-- Undefined
PV = 0 <-- No string buffer allocated