2016-12-31 4 views
0

次のコードが多く使われています。これは、多数の文字列と文字列連結演算(さまざまなサイズの文字列に対する何百万という演算)に使用すると、何らかの形のメモリリークを引き起こしますか?C#Winformsで新しいキーワードを使用してオブジェクトを初期化せずに内部クラスのメソッドを使用すると、メモリリークが発生する

pattern = (new CommonPattern(form)).ToString(); 

CommonPatternを実装するクラスは、(質問に関連するコードまで煮沸後)次のようになります。

internal class CommonPattern { 
    private string pattern; 
    private TForm form; 

    public CommonPattern(TForm form) { 
     pattern = pattern + form.Name; 
    } 

    public override string ToString() { 
     return pattern; 
    } 
} 

私はそうのようなデストラクタを追加しようとしています。

~CommonDesignerPattern() { } 

このコードを小さなプロジェクトで呼び出すと、問題は発生しません。しかし、150 - 200フォームのプロジェクトでは、重要な問題が発生しており、Out of memory Exceptionにつながっています。

メモリプロファイラはこの問題を見つけるのに役立っていません。私が分析したとき、最終的な容疑者として文字列バイト[]が指摘されましたが、それは私を助けませんでした。

私は非常に大きなプロジェクトの小さな部分で作業し、上記のコードで新しいコードを使用するとメモリーリークが発生し、それが原因であった場合にどのように対処するのかを学びたいと思っていました。

多くの検索結果オンラインイベントハンドラを指します。しかし、具体的には、上記のケースがメモリリークにつながる可能性があるかどうかを知りたい。

+1

繰り返し作成している文字列はどのくらいですか?それらは42,500文字よりも長いですか?大きな文字列は[大きなオブジェクトヒープ]に格納されます(http://stackoverflow.com/q/8951836/3744182)。サイズの大きい文字列を多く割り当てると、メモリの断片化が発生する可能性があります。 – dbc

+0

関連するすべての文字列がそうした方法で行われ、そのような操作が何百万もある場合は、http://stackoverflow.com/questions/21644658/how-to-use-stringbuilder-wiselyを調べることをおすすめします。 。ほとんどの場合、[最適化する]必要はありませんが(https://blog.codinghorror.com/the-sad-tragedy-of-microoptimization-theater/)、この場合はおそらく見落とされるべきではありません。それにもかかわらず、すでに述べたように、そのような構造体( 'new T()。ToString()')はメモリリークを引き起こすべきではありません。 –

+0

私が直面している問題は、再生に長い時間がかかるので、私は別のオプションを試しています。有益なコンテンツをオンラインでご覧いただきありがとうございます。 –

答えて

0

投稿したクラスコードにメモリリークはありません。文字列の連結は文字列の追加インスタンスを作成しますが、それらの文字列が有効範囲外になると、最終的にガベージコレクタによってクリーンアップされます。

+0

こんにちは。 **パターン=(新しいCommonPattern(form))ToString(); **文が作成されたアプリケーションの終了時または関数の最後にメモリが再利用されますか? –

+0

ガベージコレクタの実行時にメモリが再利用されます。 GCは、そうするためのメモリがあるときに実行されます。詳細はこちらを参照してください:https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx#conditions_for_a_garbage_collection –

+0

John Koernerさん、こんにちは。メモリ解放。 –

関連する問題