托管C#中的免费非托管c代码内存

时间:2011-03-09 18:59:51

标签: c# memory unmanaged

我有一个大型的c代码库,用于将其结果写入文件。我将它转换为通过float *数组将其数据返回到类似的C ++程序(以避免常量文件I / O):

float* mgrib(...)

这在c ++中运行良好,我可以“释放”内存。我设法通过以下方式将数据正确地导入C#:

IntPtr pointer = mgrib(...);
float[] result = new float[ size ];
Marshal.Copy( pointer, result, 0, size );
Marshal.FreeCoTaskMem( pointer );

这是在循环内,因为必须从函数中提取许多字段。如果它少于256个字段,那么效果很好。如果它更多,它会在没有警告的情况下崩溃。如果我通过它正确运行文件然后运行另一个(总计超过256)它崩溃。我远非CS专家,但256似乎不仅仅是巧合。

我很欣赏任何见解。感谢。

1 个答案:

答案 0 :(得分:7)

首先,您确定C ++库使用CoTaskMemAlloc分配返回值缓冲区,以便您可以使用Marshall.FreeCoTaskMem释放它吗?有various memory (de)allocation functions,您无法自由混合它们。

这就是为什么库经常被设计为“在单侧”分配和解除分配存储器的原因,例如,使用像

这样的东西
void mgrib(..., float *buff, int buffsize);