确定哪个DLL分配了IntPtr

时间:2011-11-17 13:38:16

标签: c# memory-management interop intptr

我正在研究一个使用从两个单独的C ++ DLL返回的IntPtr的系统。通过调用每个DLL中提供的OBJECT_FREE方法释放非托管内存。

不幸的是,有些代码会丢失最初分配内存的DLL。这导致访问冲突,因为我们已经转移到Win7(由于某种原因,我们在WinXP上侥幸逃脱)。

从中期来看,我将必须完成每个IntPtr以正确处理这个问题,但在短期内,有没有办法确定哪个DLL最初分配了内存?

2 个答案:

答案 0 :(得分:2)

不 - IntPtr只是一个整数(实际上是一个指针)的简单包装器 - 没有额外的元数据,显然不可能只从它来自的数字中分辨出来。

如果您需要释放与IntPtr相关联的内存,那么我建议您为两个单独的C ++ DLL中的每一个implement a safe handle修改PInvoke调用以使用安全句柄,例如:< / p>

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相关联的资源的正确方法。

请参阅安全句柄上的this MSDN blog article了解详情。

答案 1 :(得分:1)

只给出一个IntPtr,无法确定哪个非托管库分配了这块内存。