PInvoke:在C ++中分配内存并在C#中释放它

威尔伯特

我们正在使用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;
        }
    }
}

现在我想添加第二个ctor

    public MeshDataStruct(bool filled_in_by_native_codee)
    {
        _vertex_count = 0;
        _vertices = IntPtr.Zero;
    }

然后用C ++编写一个方法,该方法允许C ++填充数据。这将使我们能够对输入和输出数据使用相同的结构...

但是,据我了解,它AllocHGlobal可以在C#和C ++ / Cli中使用,但不能用于纯C ++。

所以我的问题是:如何在C ++中分配内存,以便可以通过调用C#来安全地释放它Marshal.FreeHGlobal(...)

汉斯·帕桑特

传统上,这种方法通常效果很差,Microsoft CRT使用HeapCreate()创建了自己的堆,以便为C或C ++程序中的malloc / new调用提供服务。无法在C#中释放此类内存,因为您没有堆句柄。

但是,这已经发生了变化,从VS2012附带的CRT(msvcr120.dll及更高版本)开始。现在,它使用默认的进程堆,即GetProcessHeap()返回的堆。也是Marshal.Alloc / FreeHGlobal()使用的那个。因此,如果本机代码不使用调试分配器(crtdbg.h),那么现在您可以尝试一下。请小心丢弃该调试选项。

Pinvoke编组器没有更改,也没有更改。如果它必须释放内存,例如作为函数返回值返回的数组或字符串,则它将调用CoTaskMemFree()。从您的问题尚不清楚哪个适用。如有疑问,并且如果您可以在本机代码中进行选择,那么CoTaskMemAlloc()不会出错,它在C#代码中与Marshal.FreeCoTaskMem()配对。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何释放在C ++中分配的C#中的内存

来自分类Dev

如何将在C中分配的字符串返回给Ada并在Ada中释放它?

来自分类Dev

C#中的通用PInvoke

来自分类Dev

在C#中Pinvoke MoveWindow

来自分类Dev

C#中的通用PInvoke

来自分类Dev

在 C++ dll 中分配内存,在 C# 中免费

来自分类Dev

从WinForms C#调用SCROLLINFO PInvoke

来自分类Dev

Pinvoke SendMessage之后C#代码挂起

来自分类Dev

Pinvoke SendMessage后C#代码挂起

来自分类Dev

C# PInvoke 传递出 unsigned char*

来自分类Dev

在循环中分配和释放内存(C + MPI)

来自分类Dev

在C#PInvoke中引用对象数组

来自分类Dev

pinvoke c函数-System.BadImageFormatException

来自分类Dev

具有PInvoke的C#中的C ++ API

来自分类Dev

在C中循环分配和释放内存

来自分类Dev

释放C中动态分配的内存

来自分类Dev

在C中释放已分配的内存

来自分类Dev

从 C# 代码访问在 C 代码中分配的结构内存

来自分类Dev

C#和PInvoke进入32/64位DLL

来自分类Dev

用C#读取Pinvoke的DVD的特定扇区

来自分类Dev

C#和PInvoke进入32/64位DLL

来自分类Dev

在具有并行任务的Mono / C#中无法释放内存。如何解释分配?

来自分类Dev

C内存分配和释放

来自分类Dev

C ++:在函数中分配内存

来自分类Dev

C#-方法的类型签名与PInvoke不兼容

来自分类Dev

使用R包装器时,R垃圾收集器是否释放C中分配的内存?

来自分类Dev

C#Interop-释放在非托管代码中分配的内存

来自分类Dev

释放C中的内存

来自分类Dev

释放的指针未在C中分配