我有一个用 C++ 编写的进程外 COM 服务器,它由一些 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 使用 SysAllocStringLen() 在内部分配 BSTR。
在 C# 客户端中,我只需执行以下操作:
string request = "something";
string response = "";
myserver.ProcessRequest(request, out response);
DoSomething(response);
这是可行的,因为请求字符串被发送到 COM 服务器,并且正确的响应字符串被返回给 C# 客户端。但是每次到服务器的往返都会泄漏服务器进程中的内存。crt 泄漏检测支持显示 crt 堆上没有明显的泄漏,所以我怀疑泄漏是用 IMalloc 分配的。
我在这里做错什么了吗?我发现了一些模糊的评论,即“必须使用 CoTaskMemAlloc 分配所有参数,否则互操作编组器不会释放它们”,但没有详细信息。
安迪