我需要在回调中释放 IntPtr 吗?
Do I need to release an IntPtr inside a callback?
我正在跨 C/C# 个边界编组数据。我有以下结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Message
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string From;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Subject;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string Body;
}
回调定义如下:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void MessageReceiveDelegate([In]IntPtr ptrToMessage);
private void MessageReceiveCallback(IntPtr ptrToMessage)
{
Message message = (Message)Marshal.PtrToStructure(ptrToMessage, typeof(Message));
Marshal.FreeHGlobal(ptrToMessage); //This throws COMException!
}
我的问题是,我是否需要担心在回调中释放 IntPtr (ptrToMessage) 以避免内存泄漏?我尝试在其上调用 FreeHGlobal,但最终出现以下异常:
An unhandled exception of type
'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
Additional information: The handle is invalid. (Exception from
HRESULT: 0x80070006 (E_HANDLE))
所以我要么做错了,要么内存不需要我释放
这块内存是你分配的?如果是这样 - 是的,很可能你必须自己释放它。如果没有...
你用什么API?它是否声明您必须释放该内存?使用了什么分配器?它是否定义了释放该内存的方法?如果是这样 - 是的,你必须释放它。如果没有...
不,你不应该释放它。例如,它可能只是指向分配在堆栈上的结构的指针。
如果你有一个指针,并不意味着它是一个动态分配的内存。
我正在跨 C/C# 个边界编组数据。我有以下结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Message
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string From;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Subject;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string Body;
}
回调定义如下:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void MessageReceiveDelegate([In]IntPtr ptrToMessage);
private void MessageReceiveCallback(IntPtr ptrToMessage)
{
Message message = (Message)Marshal.PtrToStructure(ptrToMessage, typeof(Message));
Marshal.FreeHGlobal(ptrToMessage); //This throws COMException!
}
我的问题是,我是否需要担心在回调中释放 IntPtr (ptrToMessage) 以避免内存泄漏?我尝试在其上调用 FreeHGlobal,但最终出现以下异常:
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
Additional information: The handle is invalid. (Exception from HRESULT: 0x80070006 (E_HANDLE))
所以我要么做错了,要么内存不需要我释放
这块内存是你分配的?如果是这样 - 是的,很可能你必须自己释放它。如果没有...
你用什么API?它是否声明您必须释放该内存?使用了什么分配器?它是否定义了释放该内存的方法?如果是这样 - 是的,你必须释放它。如果没有...
不,你不应该释放它。例如,它可能只是指向分配在堆栈上的结构的指针。
如果你有一个指针,并不意味着它是一个动态分配的内存。