3

私は、Wrox の Professional C# 4 および .NET 4 の「メモリ管理とポインター」の章、特にガベージ コレクションが .NET でどのように機能するかについて読んでいました。「ガベージ コレクターは、管理されていないリソース (ファイル ハンドル、ネットワーク接続、データベース接続など) を解放する方法を認識していない」ため、そのようなクラスはデストラクタ(別名「ファイナライザ」) を宣言するか、実装する必要があります。 IDisposable.

これらの「管理されていないリソース」の例はすべて、アプリケーションとは無関係で .NET Framework から独立したシステムとの対話に関連しているようです。ただし、それが完全な区別であるかどうかはわかりませんので、

管理されていないリソースにあり、管理されているリソースにはない特徴とは正確には何ですか?

4

4 に答える 4

3

正解です。
マネージド リソースは CLR によって管理されますが、アンマネージド リソースはそうではありません。つまり、管理されたリソースは .NET の世界にのみ存在し、管理されていないリソースは通常の Win32 の世界に存在します。

于 2011-03-17T13:43:12.507 に答える
2

管理されたリソース (メモリなど) を使用すると、使用後にリソースがどうなるかを心配する必要はありません。CLR がそれを処理します。

管理されていないリソース (Windows カーネル オブジェクト、GDI オブジェクト、USER オブジェクトなど、いくつかの種類があります)は、使用が終わったら解放してシステムに戻す必要があります。これは、プロセスが終了すると自動的に発生しますが、その間にリークが発生すると、システム内のすべてのプロセス間で共有されるリソースがリークするため、大きな問題が発生します。

もちろん、.NET にはこれらのアンマネージ リソースを (破棄/ファイナライズ パターンを使用して) ラップし、面倒な作業を行うクラスがいくつかあります。可能であればそれらを使用してください。

于 2011-03-17T13:50:12.060 に答える
0

一般に、.Net フレームワークを使用して作成されたものはすべて管理対象リソースであると言えます。内部的には管理されていないリソースを使用する可能性がありますが、あなたの観点からは管理されています。これに対する例外の 1 つは、P/Invoke の場合です。.Net で動作する関数を作成しても、呼び出しは .Net の「サンドボックス」の外に渡されるため、管理されていないと見なされます。

@supercat への返信

有効期間の長いオブジェクトからのイベントは、完全に .net フレームワーク内で処理される場合がありますが、メモリ リークを防ぐために、管理されていないリソースと見なす必要があります。

ここには2つの別個のものがあると思います。マネージドとアンマネージドの議論があり、アプリケーションのメモリ管理の議論があります。一部のオブジェクトは、管理されていないかのように扱う必要がありますが、それはそれらが管理されていないという意味ではありません。たとえば、Brush管理されていると見なすクラスですが、 を呼び出して管理されていないものとして扱う必要がありますDispose()。クラス内に隠されている/抽象化されているのは、管理対象外のオブジェクトですDispose()。しかしDispose()、実際にはリソースを解放するわけではなく、開発者が正しく実装することを望む単なるパターンです。

さらに言えば、ほとんどのアンマネージ オブジェクトはCreateXYZ()、ポインターを返す Win32 メソッドを呼び出すことによって作成されますが、同じポインターを受け取る「DestroyXYZ()/DeleteXYZ()」メソッドを使用して解放する必要があります。一方、マネージド オブジェクトは Dispose/Finalize を実装してこれを行います。繰り返しますが、管理対象リソースの作成者がこれを行っていることを願っていますが、保証はありません。

于 2011-03-17T13:46:07.573 に答える
0

「管理されていないリソース」という用語は紛らわしいです。より有用な概念は、「クリーンアップの責任」です。オブジェクトが管理されていないリソースを保持している場合、それは次の 3 つのことを意味します。

  1. それは自身の外にある長命の実体を操り、
  2. そのエンティティはクリーンアップが必要な状態にある可能性があり、
  3. オブジェクトは、必要なクリーンアップを提供する責任があります

一般に、「管理されたリソース」という用語は、管理されていないリソースを保持しているが、放棄されたことが判明した場合にガベージ コレクターから (ファイナライズ ルーチンを介して) 通知を受け取り、そのような通知を使用して提供するオブジェクトを指すために使用されます。クリーンアップ (通常のクリーンアップ メソッドが呼び出される前に放棄された場合)。「管理対象リソース」という用語を使用して、クリーンアップを必要としないものを指す人もいますが、手動でクリーンアップする必要があるものを指すのに適した用語が他にないため、私はそのような使用法は好きではありませんが、通常のクリーンアップが行われない場合に備えて、ファイナライズをフォールバックとして使用します。

管理されていないリソースは、多くの場合、ファイルの OS ハンドル、GDI エンティティなどのようなものですが、そのような用語で考えるのは間違いであることに注意してください。.Net フレームワークの外部にアクセスしないアンマネージド リソースを持つことができます。イベント ハンドラーはその一般的な例です。管理されていないリソースの重要な側面は、クリーンアップが必要であり、そのようなクリーンアップの実行に失敗すると、望ましくない結果が生じることです。

于 2011-03-17T15:11:14.233 に答える