强迫CCW Garbge Collection

时间:2017-09-18 07:04:51

标签: c++ .net garbage-collection ccw

在C ++未损坏的项目中,通过COM Callable Wrapper (CCW)使用外部(*)托管DLL(在RegAsm中注册)。但是存在内存泄漏:管理内存从未被清理过。

背景:C ++项目是一个老式的32位程序。它加载了几个DLL,其中一些是托管DLL(用C#编写)。

在最小的例子中,.Net DLL工作正常。 GC可能会以不同的方式使用托管代码而感到困惑吗?

如何强制执行CCW的垃圾收集?

现有Wrapper中的以下代码无效:

    __declspec(dllexport) void ExecuteCcwGcWrapper(void* ComObject)
    {
        IntPtr ptr(ComObject);
        Object^  obj = System::Runtime::InteropServices::Marshal::GetObjectForIUnknown(ptr);
        try {
            System::Runtime::InteropServices::Marshal::FinalReleaseComObject(obj);
        }
        catch (ArgumentException^ e) {
            System::Diagnostics::Debug::WriteLine(e->Message);
        }
        catch (ArgumentNullException^ e) {
            System::Diagnostics::Debug::WriteLine(e->Message);
        }
        catch (Exception^ e) {
            System::Diagnostics::Debug::WriteLine(e->Message);
        }
    }

" FinalReleaseComObject"中的ArgumentException; - >没有COM对象。在Debugger中,对象" obj"看起来很好。结构,数据都可以。

以下代码将运行,但不起作用:

    __declspec(dllexport) void ExecuteCcwGcWrapper(void* ComObject)
    {
        IntPtr ptr(ComObject);
        while (System::Runtime::InteropServices::Marshal::Release(ptr) > 0);
        //System::GC::AddMemoryPressure(0x7FFFFFFF);
        System::GC::Collect();
        //System::GC::WaitForFullGCComplete();
        System::GC::WaitForPendingFinalizers();
    }

(*我无法访问来源)

1 个答案:

答案 0 :(得分:0)

正如德国论坛CCW GC did not work所讨论的那样:

System::GC::Collect(System::GC::MaxGeneration, System::GCCollectionMode::Forced, true);
System::GC::WaitForPendingFinalizers();
System::GC::Collect(System::GC::MaxGeneration, System::GCCollectionMode::Forced, true);

会做到这一点。

污垢解决方案:GC::GetTotalMemory