我们正在使用PInvoke在C#和C++之间进行交互。
我有一个交互结构体如下,另一侧有一个相同布局的C++结构体。
[StructLayout(LayoutKind.Sequential)]
public struct MeshDataStruct : IDisposable
{
public MeshDataStruct(double[] vertices, int[] triangles , int[] surfaces)
{
_vertex_count = vertices.Length / 3;
_vertices = Marshal.AllocHGlobal(_vertex_count*3*sizeof (double));
Marshal.Copy(vertices, 0, _vertices, _vertex_count);
}
// .. extract data methods to double[] etc.
private IntPtr _vertices;
private int _vertex_count;
public void Dispose()
{
if (_vertices != IntPtr.Zero)
{
Marshal.FreeHGlobal(_vertices);
_vertices = IntPtr.Zero;
}
}
}
现在我想添加第二个构造函数。
public MeshDataStruct(bool filled_in_by_native_codee)
{
_vertex_count = 0;
_vertices = IntPtr.Zero;
}
然后在C++中编写一个方法,允许C++填充数据。这将使我们可以使用相同的结构来处理输入和输出数据……
但据我所知,AllocHGlobal
在C#和C++/Cli中可用,但在纯C++中不可用。
那么我的问题是:如何在C++中分配内存,以便我可以通过调用 Marshal.FreeHGlobal(...)
在C#端安全释放它?
GlobalAlloc
,LocalAlloc
函数和Heap函数:https://msdn.microsoft.com/en-us/library/windows/desktop/aa366711%28v=vs.85%29.aspx。此外,我不建议让两种不同的语言尝试弄清楚彼此如何分配或释放内存。让每种语言负责自己的内存,唯一可能的例外是使用我之前提到的Windows API堆分配函数。 - PaulMcKenzie