0

メモリ リークの可能性を修正するために、その背後にある歴史を以下に示します。VB 6.0 または VC 6.0 のテキスト エディター コントロールを .NET でも使用する必要がありました。したがって、このコントロールのアセンブリでは、このテキスト エディターへの Interop 参照が見られます。次に、.NET カスタム コントロールを作成し、そのテキスト エディターをそこにドロップして、それを必要とするプロジェクトで使用しています。

したがって、Designer.cs ファイルには、次のような変数が表示されます。

private AxTextEditorLib.AxTextEditor ctlTEEditor;

そして、次のようなパブリック プロパティ:

[Obsolete("This accessor method was added as a convenience for migrating to this component. Remove at earliest convenience.")]
[Browsable(false)]
public AxTextEditor TextEditor
{
    get
    {
        return ctlTEEditor;
    }
}

.NET デザイナ自体は、次のように、このための標準の破棄メソッドを生成しています。

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}

しかし、それで十分ですか?より多くのメモリ処理が必要ですか? Marshal.ReleaseObjects などを使用する必要がありますか? イベント ハンドラーを手動で解放する必要がありますか?

ここに画像の説明を入力

4

2 に答える 2

1

呼び出しの有効性は、呼び出しDispose()の連鎖で何が起こるかに常に依存しDisposeます。したがって、この例では、Designer コードは、コレクションDisposeに追加された各コンポーネントのメソッドを呼び出しています。components

それが役に立つかどうかを判断するには、componentsコレクションに含まれるコンポーネントとDispose、それらのコンポーネントのメソッドが何をするかを調べる必要があります。

確かに、コードの他の部分にイベント ハンドラーをアタッチしている場合は、Dispose.

ラップされたコンポーネントの場合、破棄の一部として設定する価値nullがありますが、独自の Dispose メソッドがあるかどうか、またはリソースを解放する可能性のある他のメソッドがあるかどうかも確認してください。

于 2012-12-10T20:42:39.930 に答える
1

まだ null でない場合は、ctlTEEditor を null に設定します。また、このコントロールのパブリック プロパティ/メソッドをチェックして、メモリを解放するために公開されているメソッドがあるかどうかを確認します。

于 2012-12-10T20:43:27.747 に答える