0

私がやりたいのは、使用中のステートメントでリークしている可能性のあるいくつかの疑わしい関数をラップして、ガベージ コレクションをトリガーすることです。誰かがこのようなものを使用または見たことがありますか? これは機能しますか?これについてどう思いますか?

using (String wrapper = new String("maybe this will trigger gc")){
  //do stuff here
  //or maybe:
  // function1();
  // function2();
  //
  //and then see if its leaking?

  // eg:
       _mygeometry = new Geometry();
       _mygeometry = null; // will GC free this ?
}

これはうまくいくと思いますか?これを以前に使用したことがありますか?文字列以外でできることはありますか? 私はWPFを使用していますが、( var Garbage = 1 ){} を使用してみましたが、機能しません。

4

2 に答える 2

7

usingステートメントは、IDisposableを実装するクラスに対してのみ機能します。内で定義したオブジェクトが、ブロックの実行後、または何らかの例外が発生した場合でも、using()そのメソッドを呼び出すことを確認するだけです。これは、ブロックで使用するのとDispose同じです。tryfinally

アプリケーションでメモリリークが疑われる場合は、利用可能なメモリプロファイラーのいくつかを使用して問題を検出するとよいでしょう。

Stringクラスが実装されていないため、現在のコードはコンパイルしないでくださいIDisposable

編集:

編集された質問以来

_mygeometry = null; // will GC free this ?

このSOリンクが表示されます: C#:オブジェクト変数をnullに割り当てる必要がありますか? とVinayCからの回答

于 2012-08-13T03:31:31.870 に答える
1

ステートメントIDisposable内で使用できるのは、実装するクラスのみです。using(...){...}

using ステートメントを使用すると、プログラマは、リソースを使用するオブジェクトがそれらを解放するタイミングを指定できます。using ステートメントに提供されるオブジェクトは、IDisposable インターフェイスを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放する Dispose メソッドを提供します。

出典: MSDN

残念ながら、string はこのインターフェイスを実装していません。文字列がアプリでメモリ リークを引き起こしている疑いがありますか? 何を処理していますか?検査できるようにコードを投稿していただけますか?

于 2012-08-13T03:26:56.470 に答える