お蔵入り

clip!clip!
Ads By Google

関数内で生成したローカルな文字列変数をリターンしても問題ないのでしょうか?

JavaScriptの根本に関わる質問なのですが、
関数内で生成した文字列を返す関数(例 参照)について、
メモリを無駄に占有し続けたりなどの悪影響は及ぼさないものなのでしょうか?

C言語(ポインタ渡し)でこういう関数を書くと、メモリ領域が開放されて暴走の元になりますよね。
こういった関数を数十個持つ巨大プログラムを作ったので心配なのですが、
幾つかの書籍を調べましたがそういうことに関する説明は見つかりませんでした。

尚、他の書き方も数通り考えてみましたがどれもプログラムが冗長になり、できれば避けたいです。

例:
function func() {
var str;
str = "文字列の"+"演算式";
return str;
}
var retstr = func();

2008-08-14 16:15の質問
javascript  
JavaScript例文辞典
JavaScript例文辞典 のホームページはこちらです
www.openspc2.org/reibun/javascript/
この質問は、30日間解決しなかったために自動的に質問が一旦閉じられました。

回答(1)

1.

2008-08-14 17:34:38
JavaScript における文字列は、値型(基本型)でもあり、参照型(オブジェクト型)でもあるような特殊なモノなのですが、その内容を変更することはできないので、何らかの操作をするウチ、結局コピーされたものをいじることになり元の文字列への参照は失われることかと思います。
JavaScript では、参照されなくなったオブジェクトは、自動的にメモリが回収されますので、心配しなくても良いです。(メモリ管理は、Cとは違いシステムが自動でやるので、そのために暴走したりというようなことはありません)
逆に参照があるウチは存在(メモリを占有)し続けます。しかし、それは、必要(使われる可能性)があるということなので問題にはなりません。

疑問点があれば、更に追補の質問をどうぞ。
回答レベル : 回答
Ads By Google

コメント(3)

2008-08-14 21:05:01

Cでの
int foo(){
 int i=1;
 return i;
}
と同じように値が返されると思えば違和感がないような気がします。

#2.  BLUEPIXY
2008-08-15 03:16:24

>>#1
値型であるか参照型であるかではなく、
"文字列" は、実際のところ参照型といってもいいかと思うので、メモリ管理を自動でしてくれるかどうかが肝心だと思います。

Cでだめなのは、スタック上に確保した文字配列のアドレスを返したりするからで、
malloc したアドレスを返せば問題ありません。
(それが、malloc されているということと、自分でfree しなくちゃいけない:自分で管理しないといけない、けど)

もう一度、結論を書くと
関数が終了しても、参照されているウチは、解放されない。(なので解放されている領域をアクセスするということはなく安全である)
参照がなくなると、自動的に解放(メモリ回収:Cでいうfree)される(ムダに占有しない)
JavaScript ではそのように、自動的にメモリの管理を行ってくれる。

#3.  BLUEPIXY
2008-08-15 17:49:00

参照されている限り存在するということは、
逆に言えば、複数の間で相互に参照されているような場合、実際には使用されなくなっても、メモリを占有し続けるということがあります。
(ただし、処理系によっては、そのようなモノでも検出しメモリ回収するものもあります)

トラックバック(2)

トラックバックURL:

★長澤まさみ乳首見えちゃった!! 【動画】

★長澤まさみ乳首見えちゃった!! 【動画】

★長澤まさみ乳首見えちゃった!! 【動画】 at 2009年06月27日 18:22:15