2


0

私が参照型の浅いコピーを正しく理解していることと、ここで大量のメモリリークが発生していないことを確認するためだけに:

// Adds text to the beginning of the log RTB
// Also keeps the log RTB trimmed to 100 lines
var lines =新しい文字列[rtbLog.Lines.Length 1]; lines [0] = "text"; Array.Copy(rtbLog.Lines、0、lines、1、rtbLog.Lines.Length);

if(lines.Length> 100){Array.Resize(ref lines、100); }

rtbLog.Lines = lines;

これは最初にrtbLog.Linesの文字列への参照を行にコピーします。 その後、行から最初の100個の参照を新しい文字列配列にコピーします。

rtbLog.Linesが最初に参照していた配列、最初はlinesで参照されていた配列(サイズ変更前)、最後にlinesに含まれていない文字列(サイズ変更後)はすべてガベージコレクトされます。 (私はそれが理にかなっていると思います)

正しい?

2 Answer


1


Array.Resizeメソッドは少し誤称です。 それは本当にCopyToNewArrayWithSizeという名前であるべきです。 内部的には、このAPIは新しい配列を作成し、指定されたデータをその配列にコピーします。 その後、新しい配列が参照によって返されます。

ごみ収集も。 Linesプロパティを新しい配列に再設定することで、元の配列への参照を正常に削除できました。 配列への参照が他にない限り、将来のある時点でガベージコレクションされます。


0


はい、これ以上使用されなくなった元の配列と文字列はガベージコレクションされたものです。

配列を作成する前に必要なサイズを計算する場合は、 `+ Resize +`を呼び出す必要はありません(配列の別のコピーが作成されるため)。

// Adds text to the beginning of the log RTB
// Also keeps the log RTB trimmed to 100 lines
int size = Math.Min(rtbLog.Lines.Length + 1, 100);
string[] lines = new string[size];
lines[0] = "text";
Array.Copy(rtbLog.Lines, 0, lines, 1, size - 1);
rtbLog.Lines = lines;