2017-02-07 28 views
0

私はCとC++(GCなしの言語)で経験はありますが、最近はC#をたくさん使っています。私は答えがあると思う質問を持っていますが、私は誰かが私を確認したり、(私が間違っている)私を修正したいです。C#(メモリ管理)の配列の管理

は私が

int[,] g = new int[nx, ny];

非常に簡単に次があるとします。これは、intの2次元配列のメモリを分けるだけです。その後、配列の限界としてnxまたはnyを超えない限り、私はそれを使うことができます。今

、私はこの数回が、NX年代異なるとNYのたびにをしたいと仮定し(この新しい値が計算されているかは重要ではない)

ので、私は

int[,] g; 

for(k=0;k<numberOfTimes;k++) 
{ 
//re-calculate nx and ny 


g = new int[nx, ny]; 

//work with g 


} 

を行うだろう通常、私はgのためにメモリを分離するたびに、決して到達できない漏れたメモリを残していると思います。明らかに、私はこれを "削除"する必要があります。 しかし、C#はガベージコレクションを持っているので、上記のことを刑罰なしで行うことはできますか?

つまり、私のコードは十分安全ですか?

もっと良い点はありますか?

+0

あなたはそれをやっています。その配列への参照を含む非ローカルフィールドがある場合は、それがnullに設定されているか、新しい配列への参照に置き換えられていることを確認してください。配列を参照する静的なフィールドを持っているなら、明らかにその参照が到達可能な間はメモリは保持されます。 –

+0

短い答え:アンマネージドリソースを扱っているか、本当に大きなオブジェクトを割り当てている場合を除いて、C#でメモリリークについて一般に心配する必要はありません。 – Abion47

答えて

3

コードは安全です。

GCは、スタックを指す参照を持たないヒープ上のオブジェクトのみを収集します。あなたのシナリオのように、forループスコープの変数は別の参照を取得します。以前の配列は、参照可能なすべての参照を失い、しばらくの間に収集されます。

また、コンパイル時に後で最適化されるため、変数を外部スコープで宣言する必要はありません。詳細:here