托管C#中的*非托管C代码内存

托管C#中的*非托管C代码内存

问题描述:

我有一个很大的C代码库,用于将其结果写入文件。我将它转换到经由浮子*阵列返回它的数据到一个C++程序等这样的(以避免恒定文件I/O):托管C#中的*非托管C代码内存

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似乎不仅仅是巧合。

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

首先,您确定C++库使用CoTaskMemAlloc分配返回值缓冲区,以便您可以使用Marshall.FreeCoTaskMem来释放它?有various memory (de)allocation functions,你不能*混合他们。

这就是为什么图书馆经常被设计为分配和释放“单面”内存的原因,例如,使用像

void mgrib(..., float *buff, int buffsize); 
+0

该库实际上是c代码。它被分配了malloc(我可以用c中的CoTaskMemAlloc来分配吗?)。从我在线阅读的内容看,FreeCoTaskMem与malloc兼容,但是我对这些主题非常满意。感谢您的回应。 – Anthony 2011-03-09 21:25:46