일부 C# 클라이언트 코드에서 호출되는 C++로 작성된 독립 프로세스 COM 서버가 있습니다. 서버의 인터페이스 중 하나에있는 메서드는 클라이언트에 큰 BSTR을 반환하고 이것이 메모리 누수의 원인이 아닌지 의심 스럽습니다. 이 코드는 작동하지만 BSTR을 마샬링 아웃하는 데 도움을 찾고 있습니다. 약간 단순화COM interop을 사용하여 C++에서 C#으로 BSTR을 마샬링
는서버 메소드에 대한 IDL은
HRESULT ProcessRequest([in] BSTR request, [out] BSTR* pResponse);
이며처럼 구현 같습니다 A2BSTR 내부적 SysAllocStringLen를 사용 BSTR()을 할당
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;
}
. 단순히 다음을 수행 C#을 클라이언트에서
: 요청하는 문자열의string request = "something";
string response = "";
myserver.ProcessRequest(request, out response);
DoSomething(response);
이 작품은 COM 서버와 올바른 응답 문자열로 전송받을는 C# 클라이언트에 반환됩니다. 그러나 서버에 왕복 할 때마다 서버 프로세스의 메모리가 누수됩니다. crt 누수 탐지 지원은 crt 힙에 중요한 누수가 없음을 보여 주므로 누출이 IMalloc로 할당되었다고 의심됩니다.
여기에 뭐가 잘못 되었나요? 나는 모든 매개 변수가 CoTaskMemAlloc으로 할당되어야한다는 모호한 의견을 발견했다. 그렇지 않으면 interop marshaller가이를 해제하지 않을 것이지만 세부 사항은 없다.
앤디
이 질문에 대한 감사 답변 내가 ATL COM 개체와 C++로 BSTR을 사용하고있다. 내가 발견 한 한 가지는 IDL에서 BSTR *을 [out]으로 지정하면 전달 된 BSTR *이 초기화되면 메모리 누수가 발생한다는 것입니다. 따라서 IDL 파일에서 BSTR *을 [in, out]으로 선언해야합니다. http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx –