- - PR -
文字列の参照について質問
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-11-24 10:20
考えていたら混乱してきたので質問させていただきます。
例えば下記のソースで、
とあった場合、 ・makeB()メソッド発行後はCls_AのstrAはCls_BのstrBを参照していますよね? ・その後、freeB()メソッドが発行されると参照されなくなると考えてよいのでしょうか? 参照について調べていて疑問に感じました。 | ||||||||||||
|
投稿日時: 2004-11-24 11:32
微妙に違います。Cls_Bのコンストラクタ内部での参照先書き換えの結果、Stringオブ ジェクト("")への参照を持っている状態から、("BBB")への参照を持っている状態にな ります。
そのようなことにはなりません。 freeB()内部の処理で、Cls_A#str_Aへの書き込みは起きていません。 と書けば通じますか? | ||||||||||||
|
投稿日時: 2004-11-24 13:07
シュンさんご返答ありがとうございます。
よくわかりました。("")への参照はなくなるわけですね。
では、freeB()を下記のようにすればstrBへの参照はなくなるのですね?
| ||||||||||||
|
投稿日時: 2004-11-24 13:08
本当は図を描いて説明したほうが良いのでしょうけど。
strA = "" → "BBB"へのメモリ空間上のアドレス参照 strB = "BBB"への参照 だから、strBが消えてもstrAの参照先は変わりません。 strB = nullとしても同じです。 もっといえば、GCの対象にならないということです。 | ||||||||||||
|
投稿日時: 2004-11-24 13:32
Sameさんご返答ありがとうございます。
わかりました。 では、通常Cls_BのstrBをCls_AのstrAに入れる場合はどのように すれば参照が残らずに渡す事ができるのでしょうか? | ||||||||||||
|
投稿日時: 2004-11-24 14:37
うーーん。私の読解力が無いので・・・ Cls_Bが、どうなってCls_AのstrAがどうなると嬉しいのかわからんのですが、 下記のようなことをお望みならできません。 Cls_AのstrA(String)をCls_Bのフィールドから取得した場合に・・・ ・Cls_Bがメモリ上からなくなるとCls_AのStrAに対して操作するとNullPointerが発生するようにしたい。 -> 不可能(Cls_Bが消えても、"BBB"は消えない) # できないっていうのは、現状のコードの場合のことです。 # もちろん。それっぽく動作させる設計をする事は可能です。 # Cls_AのstrAをnullなり""にする契機を考えるだけ。 そもそも、Stringは不変オブジェクトなので参照ウンヌンは気にしなくてもいいと思います。 気にしなくていい = Cls_Aの知らないところで参照先の文字列が""になったり、nullになったり"AAA"になったりしません。 | ||||||||||||
|
投稿日時: 2004-11-24 15:22
工夫しないと、できないですね。 例えば、参照元をリストに登録しておいて、その契機に参照先を更新するとか、 あるインスタンスのフィールドに宣言しておいて、そのインスタンス自体を参照先にするとか。
そうですね。誤解の元でした。 | ||||||||||||
|
投稿日時: 2004-11-24 15:24
C++標準では、std::auto_ptrがあります。
破壊的代入、所有権移動 みたいな事でしょうか? java は boost::shared_ptr に近い + 文字列の値は不変。 [ メッセージ編集済み 編集者: MMX 編集日時 2004-11-24 15:41 ] |