我正在开发一个使用从两个单独的 C++ DLL 返回的 IntPtr 的系统。通过调用每个 DLL 中提供的 OBJECT_FREE 方法来释放非托管内存。
不幸的是,一些代码失去了最初分配内存的 DLL 的跟踪。这会导致访问冲突,因为我们已经迁移到 Win7(出于某种原因,我们在 WinXP 上侥幸逃脱)。
在中期,我将不得不包装每个 IntPtr 以正确处理这个问题,但在短期内,有没有办法确定最初是哪个 DLL 分配了内存?
我正在开发一个使用从两个单独的 C++ DLL 返回的 IntPtr 的系统。通过调用每个 DLL 中提供的 OBJECT_FREE 方法来释放非托管内存。
不幸的是,一些代码失去了最初分配内存的 DLL 的跟踪。这会导致访问冲突,因为我们已经迁移到 Win7(出于某种原因,我们在 WinXP 上侥幸逃脱)。
在中期,我将不得不包装每个 IntPtr 以正确处理这个问题,但在短期内,有没有办法确定最初是哪个 DLL 分配了内存?
不 - anIntPtr
只是一个整数(实际上是一个指针)的简单包装 - 没有额外的元数据,显然不可能仅从它来自的数字来判断。
如果您需要释放与 关联的内存,IntPtr
那么我建议您为两个单独的 C++ DLL 中的每一个实现一个安全句柄,并修改您的 PInvoke 调用以使用安全句柄,例如:
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 博客文章以了解更多信息。
只有一个IntPtr
没有办法确定哪个非托管库分配了这块内存。