1

私は、2 つの別個の C++ DLL から返された IntPtr を使用するシステムに取り組んでいます。アンマネージ メモリは、各 DLL で提供される OBJECT_FREE メソッドを呼び出すことによって解放されます。

残念ながら、一部のコードでは、最初にどの DLL がメモリを割り当てたかを追跡できません。これにより、Win7 に移行したため、アクセス違反が発生します (何らかの理由で Wi​​nXP では回避していました)。

中期的には、これを適切に処理するためにすべての IntPtr をまとめる必要がありますが、短期的には、最初にメモリを割り当てた DLL を特定する方法はありますか?

4

2 に答える 2

2

いいえIntPtr-anは整数(実際にはポインター)の単純なラッパーです-追加のメタデータはなく、それがどこから来たのかを数字だけで判断することは明らかに不可能です。

に関連付けられたメモリを解放する必要がある場合は、2つの別々のC ++ DLLのそれぞれに安全なハンドルを実装し、代わりに安全なハンドルを使用するようにPInvoke呼び出しを変更するIntPtrことをお勧めします。

internal class FirstDllSafeHandle : SafeHandleZeroOrMinusOneIsInvalid
{
    private MySafeFileHandle()
        : base(true)
    {
    }

    override protected bool ReleaseHandle()
    {        
        return NativeMethods.FirstDll_OBJECT_FREE(handle);
    }
}

internal class NativeMethods
{
    [DllImport("whatever.dll")]
    public static extern void FirstDll_OBJECT_FREE(FirstDllSafeHandle handle);
    [DllImport("whatever.dll")]
    public static extern void FirstDll_GetObject(out FirstDllSafeHandle handle);

    [DllImport("whatever.dll")]
    public static extern void SecondDll_OBJECT_FREE(SecondDllSafeHandle handle);
    [DllImport("whatever.dll")]
    public static extern void SecondDll_GetObject(out SecondDllSafeHandle handle);
}

代わりに安全なハンドルを使用するIntPtrと、他の多くの利点が得られるだけでなく、に関連付けられたリソースを解放する適切な方法をシームレスに追跡できますIntPtr

詳細については、安全なハンドルに関するこのMSDNブログ記事を参照してください。

于 2011-11-17T13:56:10.703 に答える
1

のみが与えられた場合、IntPtrどのアンマネージ ライブラリがこのメモリ チャンクを割り当てたかを判断する方法はありません。

于 2011-11-17T13:42:33.420 に答える