Есть ли необходимость освобождать память в неуправляемом коде, когда он загружается управляемым кодом - PullRequest
3 голосов
/ 10 декабря 2010

Есть 2 бинарных файла.Один из них - родной / неуправляемый C ++ dll, а другой - управляемый c # exe.Теперь то, что я делаю, - это написание функции на языке dll c ++ и выделение памяти внутри нее с помощью malloc.Я экспортировал эту функцию для использования моим модулем c #.

В C ++ я сделал:

char* FunctionHavingAllocatedMemory(int i){

char* p = (char*)malloc(100);

.....

//use p and do not free it.

return p;

}

В c # я сделал:

[DllImport("C++.dll")]

private static extern string FunctionHavingAllocatedMemory(int i);

Теперь мой вопросis: есть ли необходимость освободить память в модуле c ++ или модуль c # автоматически освободит ее, когда функция вернется.Я думаю, что поскольку c # является управляемым модулем, он автоматически очищает память.

(Хотя это хорошо, что вы освобождаете память в c ++, но у меня есть определенные ограничения, что я не могу освободить память в C ++.больше узнать об управляемых приложениях и способах управления ими). ​​

Ответы [ 3 ]

2 голосов
/ 10 декабря 2010

Сборщик мусора работает только на управляемой куче : память, выделенная в FunctionHavingAllocatedMemory, является вашей обязанностью освободить.

2 голосов
/ 10 декабря 2010

В качестве альтернативы вы можете выделить неуправляемую память в C #, используя Marshal.AllocHGlobal(), передать указатель на нее на ваш родной dll и Marshal.FreeHGlobal() обратно в C #. Класс Marshal также имеет некоторые функции для копирования данных или извлечения данных из выделенной памяти.

0 голосов
/ 10 декабря 2010

GC будет отвечать за управление памятью для управляемого кода для неуправляемого кода, вам нужно беспокоиться о том, как вернуть память.

Я думаю, вы можете определить функцию в классе c ++, которая будет внутренне освобождать память.

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