質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

リソース

効果的な演算のために必要となる、メモリ・ディスク容量・CPUの性能や環境のこと。

Q&A

解決済

1回答

4482閲覧

C# 配列やリストなどのリソースの開放について

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

リソース

効果的な演算のために必要となる、メモリ・ディスク容量・CPUの性能や環境のこと。

0グッド

1クリップ

投稿2018/07/07 16:09

C#を勉強しております。
usingなどでインスタンス化できるオブジェクトはリソースの開放が分かりやすいのですが
ソースコード中に宣言した配列やリストのリソースはいつ開放されるのでしょうか。
例えば下のような位置で配列を宣言した場合です。宣言した配列はelse{}内でしか使えないですが
elseが終わるとリソースも開放されるのでしょうか。
詳しい方いましたらご教示お願い致します。

lang

1private void button6_Click(object sender, EventArgs e) 2 { 3 if () { } 4 else 5 { 6 7 配列の宣言 8 } 9 10 } 11 12

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

この質問に回答する前に、まず「リソースとは何か」を明確にする必要があります。
リソースというものを「明確な開始宣言と終了宣言をペアで扱う必要があるもの」と定義すると、IDisposableなオブジェクト(usingで使えるもの)はまさしくリソースですが、逆に配列やリストは「それはリソースではない」ということになり、この質問の前提が成り立っていないことになります。
実際、リソースを「明示的な破棄が必要なもの」と言い換えたとき、配列やリストは「破棄するものではない」ということが分かると思います。仮に配列に「リソース」を詰めた場合であっても、破棄するべきはその要素であって、配列そのものではないのです。


と、ここまでの回答は置いといて、
インスタンス化したオブジェクト(リソースではない)が解放されるのは、プログラムコード的には「コードのどこからも辿れなくなったとき」です。つまりは、質問の通りelse句が終わって配列にアクセスできなくなった時点で「そのオブジェクトは解放された」と考えてしまって問題ないです。何故なら、誰もアクセスできなくなったオブジェクトは存在していないのと同意だからです。
そして、ランタイム的には「コードのどこからも辿れなくなったあと、任意のタイミング」で解放されます。これは.NETのランタイムで動作しているGCによるもので、プログラム的に「解放された」オブジェクトは、任意のタイミングでGCの手により実際にメモリ上から削除されます。このような2段構えにしている理由は、メモリ管理の自動化を現実的に可能にする手法の一つだったからです。

結局のところ、
C#のオブジェクトは「実質的に解放したと言える」であれば問題ないことがほとんどです。そのようなオブジェクトであれば、「メモリの管理はランタイムにお任せ」ができるため、プログラマの負担が大幅に減ります。しかし、どうしてもそれでは足りない存在を扱うために「リソース」という概念が生まれ、リソースを扱うためのusingという構文が生まれた、という、順序が逆なのです。

質問への回答として、
配列やリストはコードブロックを抜けたら「実質的に解放」と考え、その実際のメモリ領域は「コード的に解放してあれば、いつか勝手に削除される」というものと考えておけば問題ありません。

投稿2018/07/07 17:13

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/08 03:59

コード的に解放してあげれば問題なかったのですね。参考書にもそのような解説はなく、今まで無駄な時間を割いていました。 大変分かりやすくためになる回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問