代码之家  ›  专栏  ›  技术社区  ›  ThiefMaster

在C中使用com idispatch::gettypeinfo()时发生内存泄漏#

  •  2
  • ThiefMaster  · 技术社区  · 14 年前

    我在COM DLL(C,.NET Framework v2)中具有以下功能:

    public void Leak(object jsObject) {
        Type comType;
        IDispatch disp = (IDispatch)jsObject;
        disp.GetTypeInfo(0, 0, out comType); // this line causes the leak
        Marshal.FinalReleaseComObject(disp);
        Marshal.FinalReleaseComObject(jsObject);
        disp = null;
        jsObject = null;
        GC.Collect(); GC.WaitForPendingFinalizers();
    }
    

    当从JScript重复调用此函数时,它会泄漏大量内存:

    var util = new ActiveXObject('MyLeakyCOM.MyLeakyCOM');
    
    for(var i = 0; i < 1000; i++) {
        util.Leak({});
    }
    

    我已经试着用 while(Marshal.ReleaseComObject(disp) > 0) {} 但也没有运气。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Phil Booth    14 年前

    我是一个C++的家伙,而不是一个C的家伙,但我觉得你也应该释放 comType :

    Marshal.FinalReleaseComObject(comType);
    

    这个 ITypeInfo 对象是正确的COM对象,它是 AddRef 将被调用执行 GetTypeInfo .