Свободная память C выделяется в C # - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть тонны кода на C, которые мне нужно использовать в C #. Пример:

long foo(char** mystring);
void free_string(char* mystring);

foo() использует malloc() для выделения памяти для mystring. Я пробовал несколько способов вызова этой функции из C #, но мне не удалось освободить mystring. Можете ли вы дать мне несколько советов о том, как позвонить foo(), чтобы я мог позже бесплатно mystring?

Например, если char** представлен StringBuilder[], как я могу использовать его для освобождения в free_string()?

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Выделение памяти в native для освобождения в управляемом виде накладывает большие затраты на то, чтобы вызывающая сторона точно знала, что они делают. Возможно, вы захотите рассмотреть другие способы выделения памяти в управляемом коде.

Один примерможет быть сделать обратный вызов в управляемый код для получения строкового буфера

extern "C" __declspec void GetString( char* buffer, int bufferSize );

Соответствие C # будет следующим:

void GetString( StringBuilder buffer, int bufferSize );
0 голосов
/ 20 февраля 2012

Если вы выделите память, используя LocalAlloc в kernel32.dll, вы можете освободить ее, используя Marshal.FreeHGlobal(IntPtr).Хотя вы не можете освободить память Malloc с этим.

В качестве другого решения рассмотрите возможность передачи ссылки на C # StringBuilder и заполните ее кодом C.

Также обратите внимание на статью MSDN о моделях памяти .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...