0

多くの文字列連結を使用するアプリケーションをサポートしていますが、これが最終的に OutOfMemory 例外を引き起こすメモリ リークの原因であると考えています。以下のコードをご覧ください。

Public Sub ConcatenateString() As String Dim Test1 As String

Test1 = "Hello" 
Test1=Test1 & "my" 
Test1=Test1 & "name" 
Test1=Test1 & "is" 
Test1=Test1 & "joe" 
Test1=Test1 & "blogs" 
Test1=Test1 & "what" 
Test1=Test1 & "is" 
Test1=Test1 & "yours?" 'line 10

return Test1

End Sub

String は不変オブジェクトであるため、メモリ内には 10 行目に 9 つの String があると思いますが、「Hello my name is Joe Blogs what is yours?」を含む String Test1 への参照は 1 つだけです。私の質問は; これらの文字列はすべて、範囲外になったときにガベージ コレクターによって取得されますか? つまり、サブルーチンの実行が終了したときです。メモリ リークが発生しているようで、本当に StringBuilder オブジェクトを使用する必要があると考えています。

4

2 に答える 2

3

あなたが述べたような場合... stringbuilderクラスを使用する必要があり、連結しないでください。

ガベージ コレクションは、メソッド ブロックが終了した直後に発生するとは限りませんが、後で発生します。

と のより良い比較と説明については、このリンクを参照してString concatenationくださいStringBuilder

.NET Framework アプリケーションでの文字列処理パフォーマンスの向上

文字列連結とメモリ割り当て

于 2012-06-16T15:29:50.843 に答える
2

文字列が非常に大きい場合でも、文字列の連結によってメモリ不足の例外が発生する可能性はほとんどありません。最近の仮想メモリでは、メモリ不足の例外が実際に RAM が不足していることを示すことはめったにありません。むしろ、メモリ不足の例外の通常の疑いは、システム ハンドル (GDI オブジェクト、ファイル ハンドルなど) が不足している場合です。タスク マネージャーでこれらの列を表示すると、使用されているハンドルの総数を確認できます。各プロセスが作成できるハンドルの最大数は、使用している Windows のバージョンとセットアップ方法によって異なりますが、通常、最大数は 10,000 です。

作成された文字列が参照されなくなると、文字列は無効であると見なされ、ガベージ コレクターによって破棄され、メモリが解放されます。したがって、メソッドが存在するとすぐに、これらすべての文字列が最終的に収集されますが、いつ収集されるかは保証されません。ガベージ コレクターにデッド オブジェクトをすぐに収集させる必要がある場合は、 を呼び出すことで実行できますGC.Collect()

ただし、そのように文字列を連結することは悪い習慣です。特に大きな文字列では、非常に非効率的です。そのような場合は StringBuilder を使用する必要があります。

Public Sub ConcatenateString() As String Dim Test1 As String
    Dim builder As New StringBuilder()
    builder.Append("Hello")
    builder.Append("my")
    builder.Append("name") 
    builder.Append("is")
    builder.Append("joe") 
    builder.Append("blogs") 
    builder.Append("what")
    builder.Append("is")
    builder.Append("yours?")
    Return builder.ToString()
End Sub
于 2012-06-16T15:34:03.873 に答える