-1

相互に参照するアンマネージ C++ クラスがいくつかあります。インスタンスが解放されたときにポインターがぶら下がるのを避けるために、ブースト スマート ポインター (主に shared_ptr) を使用しています。ここまでは順調ですね。

ただし、C++/CLI にもラッパーがあり、ほとんどすべてのアンマネージ クラスには、それを .NET アプリケーションに公開するための同等のマネージド クラスがあります。ラッパーは非常に単純ですが、ManagedClass から UnmanagedClass* を参照するためにアンセーフ ポインターを使用する必要がありました。Boost::shared_ptr を ManagedClass のメンバーとして使用することはできません。これは、CLR がアンマネージ型をクラス メンバー (それらへのポインターのみ) としてサポートしていないためです。

例: クラス Wheel の 4 つのインスタンスを含むクラス Car。5 つの管理されていないインスタンスのそれぞれには、5 つの管理された同等のインスタンスがあります。管理されていない車は車輪を変更する必要がある場合があり、管理されていない Wheel の 4 つのインスタンスが削除され、4 つの新しいインスタンスが作成されます。Managed Car は、Wheel の 4 つの新しいマネージド インスタンスを作成するために、新しいアンマネージド Wheel を要求します。

ただし、Wheel の 4 つの古いマネージド インスタンスはまだマネージド ワールドのスコープ内にあり、古いアンマネージド インスタンスへのダングリング ポインターが含まれています。ラッパーに相当するネイティブが破棄されたことを認識する方法はありますか? スマート ポインターを使用した簡単なタスク。それらをマネージ コードで使用できますか?

4

1 に答える 1

0

内部インスタンス カウントを使用しないのはなぜですか? ベース ネイティブ クラスを作成します。

class Base
{
    int refCount = 0;

public:
    void AddRef() { refCount++; }
    void Release() { refCount--; if (refCount == 0) delete this; }
}

次に、これらすべての基本クラスとして使用し、クラスのインスタンスを取得するときに AddRef を呼び出すことを忘れないでください。また、クラスが不要になったときに (たとえば、デストラクタで) Release() を呼び出すことを忘れないでください。C++/CLI クラスでも同じことを行う必要があります。IDisposable インターフェイスを実装し、Dispose() メソッドで保持されているネイティブ クラス インスタンスを消去します。コンストラクタ内で AddRef を 1 回呼び出し、デストラクタ/Dispose 内で Release を 1 回呼び出すだけでよいため、使用するのにそれほど問題はありません。

于 2012-11-21T12:04:05.483 に答える