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