У меня есть внепроцессный COM-сервер, написанный на C ++, который вызывается некоторым клиентским кодом C #. Метод на одном из интерфейсов сервера возвращает клиенту большой BSTR, и я подозреваю, что это вызывает утечку памяти. Код работает, но я ищу помощи по распределению BSTR.
Если немного упростить, IDL для метода сервера -
HRESULT ProcessRequest([in] BSTR request, [out] BSTR* pResponse);
и реализация выглядит так:
HRESULT MyClass::ProcessRequest(BSTR request, BSTR* pResponse)
{
USES_CONVERSION;
char* pszRequest = OLE2A(request);
char* pszResponse = BuildResponse(pszRequest);
delete pszRequest;
*pResponse = A2BSTR(pszResponse);
delete pszResponse;
return S_OK;
}
A2BSTR внутренне выделяет BSTR с помощью SysAllocStringLen ().
В клиенте C # я просто делаю следующее:
string request = "something";
string response = "";
myserver.ProcessRequest(request, out response);
DoSomething(response);
Это работает, когда строки запроса отправляются на COM-сервер, а правильные строки ответа возвращаются клиенту C #. Но при каждом обращении к серверу происходит утечка памяти в процессе server . Поддержка обнаружения утечки crt не показывает значительных утечек в куче crt, поэтому я подозреваю, что утечка была назначена IMalloc.
Я что-то здесь не так делаю? Я обнаружил смутные комментарии о том, что «все параметры должны быть выделены с помощью CoTaskMemAlloc, в противном случае маршаллер взаимодействия не освободит их», но никаких подробностей.
Andy