我发现自己需要帮助。现在,我对 C++ 并不是那么陌生,但是将它与 ATL 结合起来会带来全新的混乱。无论如何,我的问题:我(最终)设法将我的 COM 方法中的对象数组返回给 C# 调用者。但是在“测试”(多次重复运行所述功能)时,我发现了一个小的内存泄漏。
IDL 摘录:
...
interface IDISControl : IDispatch{
...
[id(12)] HRESULT GetNets([out,retval] VARIANT* nets);
};
标题摘录:
...
STDMETHOD(GetNets)(VARIANT* nets);
...
代码:
STDMETHODIMP CDISControl::GetNets(VARIANT* nets)
{
SNet *netz;
int32_t num;
int result, i;
result = DIS_GetNetNum(securityHandle, &num);
netz = new SNet[num];
result = DIS_GetNet(securityHandle, netz, num); //getting some data
CComSafeArray<IDispatch*> netArray;
CComObject<CDISNet> *net;
CComVariant *var;
netArray.Create(num, 0);
for (i = 0;i<num;i++){
CComObject<CDISNet>::CreateInstance(&net);
if (net == NULL)
return S_FALSE;
net->AddRef();
net->Convert(netz[i]);
netArray[i] = net;
net->Release();
net = NULL;
}
CComVariant val(netArray.Detach());
val.Detach(nets);
delete [] netz;
netArray.Destroy();
return S_OK;
}
我实例化 CDISNet 对象并将一些数据放入其中(Convert())。我把它们放在我的安全阵列中并释放。据我了解,销毁它们的责任转移到了安全阵列。之后,我将数组放入一个 VARIANT 中,这样我就可以填写我的 [out, retval] 参数。因为它是一个输出参数,所以销毁的责任应该转移给调用者(在我的例子中是 C#,即它的 GarbageCollector)。我处置了我的动态数组“netz”并销毁了 safearray 包装器。
那么我错过了什么?剩下什么分配?(这个项目真的让我很欣赏 .net 的所有便利)。
帮助。请。
编辑:进一步的调试告诉我问题肯定出在我的 CComObject 对象中。他们没有被释放。如果我delete net;
在每次迭代中,数组也会丢失数据。我不确定如何纠正...
EDIT2:好的,我在这段代码周围看了一会儿,当我注释掉变体装箱时,泄漏似乎消失了。问题是我从 safearrays 上的 Visual Studio 示例中借用了这段代码。那么,有没有人知道发生了什么:
CComVariant val(netArray.Detach());
val.Detach(nets);
……该怎么办?