関数内で生成したローカルな文字列変数をリターンしても問題ないのでしょうか?
JavaScriptの根本に関わる質問なのですが、関数内で生成した文字列を返す関数(例 参照)について、
メモリを無駄に占有し続けたりなどの悪影響は及ぼさないものなのでしょうか?
C言語(ポインタ渡し)でこういう関数を書くと、メモリ領域が開放されて暴走の元になりますよね。
こういった関数を数十個持つ巨大プログラムを作ったので心配なのですが、
幾つかの書籍を調べましたがそういうことに関する説明は見つかりませんでした。
尚、他の書き方も数通り考えてみましたがどれもプログラムが冗長になり、できれば避けたいです。
例:
function func() {
var str; str = "文字列の"+"演算式"; return str;}
var retstr = func();
回答(1)
1.
JavaScript では、参照されなくなったオブジェクトは、自動的にメモリが回収されますので、心配しなくても良いです。(メモリ管理は、Cとは違いシステムが自動でやるので、そのために暴走したりというようなことはありません) 逆に参照があるウチは存在(メモリを占有)し続けます。しかし、それは、必要(使われる可能性)があるということなので問題にはなりません。
疑問点があれば、更に追補の質問をどうぞ。
コメント(3)
Cでの
int foo(){
int i=1;
return i;
}
と同じように値が返されると思えば違和感がないような気がします。
>>#1
値型であるか参照型であるかではなく、
"文字列" は、実際のところ参照型といってもいいかと思うので、メモリ管理を自動でしてくれるかどうかが肝心だと思います。
Cでだめなのは、スタック上に確保した文字配列のアドレスを返したりするからで、
malloc したアドレスを返せば問題ありません。
(それが、malloc されているということと、自分でfree しなくちゃいけない:自分で管理しないといけない、けど)
もう一度、結論を書くと
関数が終了しても、参照されているウチは、解放されない。(なので解放されている領域をアクセスするということはなく安全である)
参照がなくなると、自動的に解放(メモリ回収:Cでいうfree)される(ムダに占有しない)
JavaScript ではそのように、自動的にメモリの管理を行ってくれる。
参照されている限り存在するということは、
逆に言えば、複数の間で相互に参照されているような場合、実際には使用されなくなっても、メモリを占有し続けるということがあります。
(ただし、処理系によっては、そのようなモノでも検出しメモリ回収するものもあります)


