あなたが書いたコードには何の問題もありません。これは主に、C#が、他の.NET言語と同様に、多くのメモリ管理を行う「管理された」言語であるためです。C ++で同じ効果を得るには、サードパーティのライブラリを明示的に使用する必要があります。
あなたのためにいくつかの基本をクリアするには:
C#では、「ポインタ」や「参照」を直接扱うことはめったにありません。必要に応じてポインタを処理できますが、これは「安全でない」コードであり、何をしているのかを理解していない限り、そのようなことは避けてください。参照(ref
またはout
パラメーターなど)を処理するいくつかのケースでは、言語はすべての詳細を非表示にし、それらを通常の変数として扱うことができます。
代わりに、C#のオブジェクトは参照型のインスタンスとして定義されます。参照型のインスタンスを使用するときはいつでも、詳細を気にする必要がないことを除いて、ポインターを使用するのと似ています。C ++でオブジェクトの新しいインスタンスを作成するのと同じ方法で、メモリの割り当てやコンストラクターの実行などを行う演算子を使用して、C#で参照タイプの新しいインスタンスを作成します。コードサンプルでは、とは両方とも参照タイプです。new
StringBuilder
List<StringBuilder>
ここで重要な管理言語の重要な側面は、自動ガベージコレクションです。実行時に、.NET Frameworkは、作成したオブジェクトを「認識」します。これは、オブジェクトを常に独自の内部管理ヒープから作成しているためです(malloc
C#では直接またはそのようなものはありません)。また、オブジェクトが完全にスコープから外れたとき、つまりプログラム内のどこにもオブジェクトへの参照がなくなったときを「認識」します。これが発生すると、ランタイムは必要なときにいつでもメモリを解放できます。通常、空きメモリが不足し始めたときに、実行する必要はありません。実際、C#には、管理対象オブジェクトを明示的に破棄する方法はありません(ただし、管理対象外のリソースを使用する場合は、それらをクリーンアップする必要があります)。
あなたの例では、ランタイムはあなたがを作成し、それを;StringBuilder
に入れたことを知っています。List<>
それはそのオブジェクトを追跡し、それがその中にある限り、List<>
それは固執します。から削除するList<>
か、List<>
それ自体がなくなると、ランタイムが自動的にクリーンアップStringBuilder
します。