Утечка памяти при использовании CoCreateInstance - PullRequest
4 голосов
/ 19 января 2011

Я использую COM для инициализации класса C # .NET с помощью неуправляемого кода на С ++, и обнаруживаю утечку памяти даже в самой простой программе:

int _tmain(int argc, _TCHAR* argv[])
{
 CoInitialize(NULL);
 ComClass::IClass1 *_comClass1;
 HRESULT hr = CoCreateInstance(__uuidof(ComClass::Class1),
         0,
         CLSCTX_INPROC_SERVER,
         __uuidof(ComClass::IClass1),
         reinterpret_cast<void**>(&_comClass1));
 _comClass1->Release();
 CoUninitialize();
 return 0;
}

класс C # также очень прост:

 [ComVisible(true), Guid("A95C4F43-65B0-4706-94D1-BEE2EF416766")]
    public interface IClass1
    {
    }

    [ComVisible(true), Guid("4670C9CD-0501-4274-BF03-E1FF65A77FEC")]
    public class Class1 : IClass1
    {
        public Class1()
        { }
    }

И все же я обнаруживаю утечки памяти. Я использую GlowCode и Purify для обнаружения утечек, но даже без них я вижу рост использования памяти.

Не правильно ли я использую CoCreateInterface? что мне не хватает?


1012 * пояснение * Это небольшая программа, которую я создал, чтобы смоделировать проблему. В моей настоящей программе есть много вызовов CoCreateInstance, и размер виртуальной машины увеличивается до 1,5 ГБ, конечно, это не может быть нормальным ... Кроме того, с помощью perfmon я вижу, что частные байты процесса растут, а байт памяти .Net CLR во всех кучах - нет. Кроме того, GlowCode может отслеживать измененную кучу и не указывает на утечку памяти в управляемой части ...

1 Ответ

6 голосов
/ 19 января 2011

Да, это нормально.Первый вызов CoCreateInstance загрузит CLR в ваш процесс.Который создает основной AppDomain для загрузки управляемого кода, с кучей мусора, кучей загрузчика и небольшим количеством внутренних структур данных.Вызов метода Release () для указателя интерфейса не выгружает CLR.Он остается для обслуживания любых будущих запросов на загрузку и выполнение управляемого кода.Основной домен приложения не выгружается до завершения процесса.

Инструмент диагностики неуправляемой памяти не узнает, что это нормально.

Истинная утечка памяти - это та, которая увеличивает виртуальную машинуРазмер процесса без верхней границы.Убедите себя, что это не настоящая утечка памяти, выполнив этот код миллиард раз.

...