Свободная неуправляемая память c-кода в управляемом C # - PullRequest
7 голосов
/ 09 марта 2011

У меня есть большая библиотека c-кода, которая раньше записывала свои результаты в файл. Я преобразовал его так, чтобы он возвращал данные через массив float * в программу на C ++, например, (чтобы избежать постоянного файлового ввода-вывода):

float* mgrib(...)

Это прекрасно работало в с ++, где я мог "освободить" память. Мне удалось получить данные в C # правильно с помощью:

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

Это внутри цикла, так как многие поля должны быть извлечены из функции. Если это меньше чем 256 полей, это прекрасно работает. Если это больше, он падает без предупреждения. Если я правильно запустил файл и запустил другой (всего более 256), он завис. Я далеко не эксперт по CS, но 256 кажется больше, чем совпадением.

Я ценю любое понимание. Спасибо.

1 Ответ

7 голосов
/ 09 марта 2011

Прежде всего, вы уверены, что библиотека C ++ выделяет буфер возвращаемого значения, используя CoTaskMemAlloc, так что вы можете освободить его, используя Marshall.FreeCoTaskMem?Существует различных функций выделения памяти (де) , и вы не можете свободно смешивать их.

Именно поэтому библиотеки очень часто предназначены для выделения и освобождения памяти «с одной стороны»,например, используйте что-то вроде

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