2011-03-09 24 views
6

Tengo una gran biblioteca de código c que solía escribir sus resultados en el archivo. Convertí para devolverlo de datos a través de un flotador * matriz a un programa en C++ como tales (para evitar archivo constante de E/S):Memoria c-code no administrada gratuita en C administrado

float* mgrib(...) 

Esto funcionó bien en C++, donde pude "libre" de la memoria. Me las arreglé para obtener los datos en C# adecuadamente a través de:

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

Esto está dentro de un bucle tantos campos deben ser extraídas de la función. Si son menos de 256 campos, funciona muy bien. Si es más, se bloquea sin previo aviso. Si ejecuto un archivo correctamente y luego ejecuto otro (un total de más de 256), se bloquea. Estoy lejos de ser un experto en CS, pero el 256 parece más que una coincidencia.

Agradezco cualquier idea. Gracias.

Respuesta

6

En primer lugar, ¿está seguro de que la biblioteca C++ asigna el búfer de valor de retorno usando CoTaskMemAlloc, para que pueda liberarlo usando Marshall.FreeCoTaskMem? Hay various memory (de)allocation functions y no se pueden mezclar libremente.

Esa es la razón por la que las bibliotecas a menudo están diseñadas para asignar y desasignar memoria "en un solo lado", p. use algo como

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

La biblioteca es en realidad código c. Fue asignado con malloc (¿Puedo asignar CoTaskMemAlloc en c?). De lo que leo en línea, FreeCoTaskMem es compatible con malloc, pero estoy loco por temas como estos. Gracias por la respuesta. – Anthony

Cuestiones relacionadas