- PR -

文字列の参照について質問

投稿者投稿内容
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-11-24 10:20
考えていたら混乱してきたので質問させていただきます。

例えば下記のソースで、
コード:
public class Cls_A {
  Cls_B clsB;
  String strA = "";
  
  public Cls_A(){
    make_B();
    free_B();
  } 
  void make_B() {
    clsB = new Cls_B(this);
  }
  void free_B() {
    clsB = null;
  }
}

public class Cls_B {
  Cls_A c_A;
  String strB = "BBB"
  public Cls_B(Cls_A cls){
    c_A = cls;
    c_A.strA = strB;
  }
}



とあった場合、
・makeB()メソッド発行後はCls_AのstrAはCls_BのstrBを参照していますよね?
・その後、freeB()メソッドが発行されると参照されなくなると考えてよいのでしょうか?

参照について調べていて疑問に感じました。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-24 11:32
引用:

makeB()メソッド発行後はCls_AのstrAはCls_BのstrBを参照していますよね?


微妙に違います。Cls_Bのコンストラクタ内部での参照先書き換えの結果、Stringオブ
ジェクト("")への参照を持っている状態から、("BBB")への参照を持っている状態にな
ります。

引用:

その後、freeB()メソッドが発行されると参照されなくなると考えてよいのでしょうか?


そのようなことにはなりません。
freeB()内部の処理で、Cls_A#str_Aへの書き込みは起きていません。

と書けば通じますか?
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-11-24 13:07
シュンさんご返答ありがとうございます。

引用:

微妙に違います。Cls_Bのコンストラクタ内部での参照先書き換えの結果、Stringオブ
ジェクト("")への参照を持っている状態から、("BBB")への参照を持っている状態にな
ります。



よくわかりました。("")への参照はなくなるわけですね。

引用:

そのようなことにはなりません。
freeB()内部の処理で、Cls_A#str_Aへの書き込みは起きていません。



では、freeB()を下記のようにすればstrBへの参照はなくなるのですね?
コード:
  void free_B() {
    clsB = null;
    strA = "";
  }

Same
会議室デビュー日: 2004/11/05
投稿数: 8
お住まい・勤務地: 鹿児島
投稿日時: 2004-11-24 13:08
本当は図を描いて説明したほうが良いのでしょうけど。

strA = "" → "BBB"へのメモリ空間上のアドレス参照
strB = "BBB"への参照

だから、strBが消えてもstrAの参照先は変わりません。
strB = nullとしても同じです。
もっといえば、GCの対象にならないということです。
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-11-24 13:32
Sameさんご返答ありがとうございます。

引用:

strA = "" → "BBB"へのメモリ空間上のアドレス参照
strB = "BBB"への参照


わかりました。
では、通常Cls_BのstrBをCls_AのstrAに入れる場合はどのように
すれば参照が残らずに渡す事ができるのでしょうか?
tak3
ベテラン
会議室デビュー日: 2004/04/15
投稿数: 80
お住まい・勤務地: 菜の花・銀杏
投稿日時: 2004-11-24 14:37
引用:

わかりました。
では、通常Cls_BのstrBをCls_AのstrAに入れる場合はどのように
すれば参照が残らずに渡す事ができるのでしょうか?


うーーん。私の読解力が無いので・・・
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"になったりしません。
Same
会議室デビュー日: 2004/11/05
投稿数: 8
お住まい・勤務地: 鹿児島
投稿日時: 2004-11-24 15:22
引用:

# できないっていうのは、現状のコードの場合のことです。
# もちろん。それっぽく動作させる設計をする事は可能です。
# Cls_AのstrAをnullなり""にする契機を考えるだけ。


工夫しないと、できないですね。
例えば、参照元をリストに登録しておいて、その契機に参照先を更新するとか、
あるインスタンスのフィールドに宣言しておいて、そのインスタンス自体を参照先にするとか。

引用:

そもそも、Stringは不変オブジェクトなので参照ウンヌンは気にしなくてもいいと思います。


そうですね。誤解の元でした。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-11-24 15:24
C++標準では、std::auto_ptrがあります。
破壊的代入、所有権移動 みたいな事でしょうか?
java は boost::shared_ptr に近い
+ 文字列の値は不変。

[ メッセージ編集済み 編集者: MMX 編集日時 2004-11-24 15:41 ]

スキルアップ/キャリアアップ(JOB@IT)