お世話になります。
以下のようなソースを書いた場合の、内側のブロックでgcnewしたオブジェクトのスコープ(生存期間)について質問させてください。
value struct STRA
{
String ^str;
};
int _tmain(int argc, _TCHAR* argv[])
{
ArrayList ^ar = gcnew ArrayList();
IEnumerator ^en;
{
ArrayList ^ar2 = gcnew ArrayList();
STRA ^strA = gcnew STRA;
strA->str = gcnew String("TEST");
ar2->Add(strA);
ar = ar2;
}
en = ar->GetEnumerator();
en->MoveNext();
STRA ^strB = safe_cast<STRA>(en->Current);
return 0;
}
内側のブロックにて、「ar = ar2」の時点でar2にAddされたオブジェクトのアドレスが入っているようのですが、その後ブロックを抜けた後でもarを通じて内側のブロックで生成したのオブジェクト(strA)の値を見ることができます。
これは、たまたまガベージコレクトがまだ働いていないためであって、やはり基本的にはブロック内で生成されたオブジェクトをブロックの外で見るべきではない、と考えたほうがよいのでしょうか。
やはり「ar = ar2」のようにするのではなく、ar2にAddされたオブジェクトをar1に再びAddしていったほうが無難でしょうか。
何卒ご教示をお願いいたします。
No.1ベストアンサー
- 回答日時:
C++/CLI については、文法について軽くチェックした程度ですが、オブジェクト指向的にはC#と同じだと思いますので、回答します。
スコープを外れるとar2にアクセスできなくなるのはその通りです。が、それはar2という変数の話であって、ar2の指していたオブジェクトとは関係がありません。
この場合は、「もともとar2が指していたものは、arを通して参照しても良い」んです。
勘違いがあると思われるポイントは、gcnewなりnewなりするところ。たとえば
ArrayList ^ar = gcnew ArrayList();
とあったら、これは、
・arという、ArrayListへの参照(ごめんなさい、CLI用語知らないのでここは不正確です)を宣言する
・gcnew ArrayList()により、新しいArrayListオブジェクトを作成する
・作成したオブジェクト へ の 参 照 を、arにおさめる
と言うことをしています。
作成した新しいオブジェクトはオブジェクト、変数arに入っているのはそのオブジェクトへ至る道でしかないわけです。
道がなくなったオブジェクトがGCの対象になります。
オブジェクトは色んな変数から参照されても構いませんし、元々参照していた変数とはたいした関係がありません。
変数とオブジェクトとの区別さえつければ、あとは簡単に分かるはずです。
ar = ar2 とコピーをした場合でも、ここで行われているのは
・ar2におさめられた「オブジェクトへの参照」をarに入れる
ことだけです。局所変数として宣言されているar2が失われたあとも、ar2が指していた先のオブジェクトは、今度はarが指し示していることになります。従ってそのオブジェクトのGCは行われません。
逆に、前にarに入っていたオブジェクトは、arから指し示されなくなりましたので、GCの対象になります。
簡単にまとめると、
・スコープは変数名についての話
・変数とオブジェクトは別物
・変数はオブジェクトを指し示しているだけ
・指し示している変数がなくなるとオブジェクトはGCの対象にされる
ということです。
とても良い疑問だと思います。がんばってください。
ご回答、ありがとうございます。
変数とオブジェクトの関係について、非常によく理解できました。
変数はあくまでもオブジェクトへの参照という意味合いなのですね。
普段使っているノーマルなCのイメージでいくとダメなはずだよなぁ……と考え込んでしまっていたのですが、これですっきりしました。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- その他(プログラミング・Web制作) Pythonのオブジェクトの関数について 2 2023/05/11 19:15
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- その他(自然科学) 信頼度がR1、R2の機器を並列に接続した場合、システム全体の信頼度はどれか。答え1-(R1)(1- 2 2023/01/15 21:45
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- 工学 電気回路の問題です。 (1)回路の入力インピーダンスZ0。 (2)回路の共振周波数を求めよ。また、そ 2 2023/05/28 23:09
- アニメ アニメコードギアスの見る順番なのですが、 時系列的に亡国のアギトって反逆のルルーシュと反逆のルルーシ 2 2023/04/15 10:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
vb.net オブジェクト指向につい...
-
Excelで =EMBED("Acrobat Docu...
-
error C2712: オブジェクト ア...
-
ビジュアルC++でボタンの有...
-
プリコンパイルされたSQL文を取...
-
多人数のじゃんけんプログラム
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
JSPのout.printについて
-
Listに格納されているオブジェ...
-
空の文字列とnullと""
-
ADO オブジェクトの渡し方
-
VBA 同じ名前のオブジェクトを...
-
VBからBATファイルを起動して戻...
-
ワイルドカード<?>と型パラメー...
-
COMコンポーネントって何?
-
戻り値がクラスオブジェクト
-
エプソンVP-930のESC/Pの操作に...
-
Date型オブジェクトから日付の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
LISTBOXの内容が更新されま...
-
Object型からDouble型へのキャスト
-
JAVAからHTMLへ値を返す方法
-
COMコンポーネントって何?
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
VBA 同じ名前のオブジェクトを...
-
ASP.net 教えてください!!(...
-
Vbで通常使用するプリンターを...
-
newは明示的にした方が良いのか?
-
CoCreateInstanceでエラーになる。
-
オブジェクトレベルとメタレベル
-
bmp画像をjpegやpng画像に圧縮...
-
Accessの連結・非連結オブジェ...
おすすめ情報