Вызывая объект C # com из c ++, кто должен освобождать память? - PullRequest
2 голосов
/ 26 марта 2012

Напримеру меня есть c # COM-объект с такой функцией:

int GetString([In, Out, MarshalAs(UnmanagedType.LPStr)]ref string str)

, тогда я вызываю int из c ++ (в c ++ COM-объект используется через ключевое слово #import), в сгенерированном методе оболочки объявлен как:

GetString(LPSTR * str, long * retVal)

я называю это так:

char myStr[40];
LPSTR buf = (LPSTR)myStr;
LPSTR pBuf = &buf;

pComObject->GetString(pBuf);

, что странно:

1) myStr не заполнено, и значение buf изменяется (ононе то же самое с myStr после вызова), поэтому, я полагаю, что c # marshaller выделяет новый блок памяти

2), если c # выделяет память, поэтому я должен вызывать free(buf); или нет?

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Да, клиент должен освободить память. В этом случае следует использовать функцию CoTaskMemFree для освобождения полученного буфера. Поскольку буфер не может быть выделен в куче клиента. CoTaskMemFree вызовет соответствующее средство удаления.

2 голосов
/ 26 марта 2012

Да, я думаю, что вам нужно освободить буфер в коде C ++ после вызова функции GetString.

В соответствии с COM "Правилами управления памятью" , вызывающая сторона (Ваш код C ++) должен освободить память, которая возвращается в качестве выходного параметра.В случае параметра ввода / вывода вызываемый объект (CLR и ваш код C #) может освободить память для параметра, который вы передали, а затем выделить новую память для выходного значения, и это опять-таки является обязанностью вызывающей стороны освободитьэта память.

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