Утечки памяти VC2008 C ++ - PullRequest
       44

Утечки памяти VC2008 C ++

0 голосов
/ 21 октября 2011

обратите внимание, мой уровень владения английским очень низкий. но я сделаю все возможное, чтобы объяснить.


Я делаю проект MFC в Visual Studio 2008 sp1.

этот проект включал статическую библиотеку, созданную в 2008 / sp1 / native C ++

проблема в том, что шаг:

1) сборка и запуск отладки в проекте mfc
2) нажмите кнопку x в главном окне или alt + f4, чтобы выйти из программы
3) главное окно закрывается сразу
4) но когда я смотрю вкладку процесса taskmgr, она все еще жива.
5) если я попытаюсь убить процесс проекта mfc на taskmgr, он сразу убьется
6) но Visual Studio по-прежнему работает в режиме отладки и очень долго возвращается в среду.
7) время 5 ~ 10 минут
8) и выходной журнал, обнаруженные утечки памяти !!
9) журнал очень большой почти 11 мегабайт текста


и я нахожу точку.
1) статическая библиотека всегда создает экземпляр основного функционального класса библиотеки при запуске, используя оператор new (запуск - статическое время, перед main)
2) конструктор статической библиотеки имеет следующий код
примечание: извините, я пытаюсь просмотреть вкладку «Код» в этом редакторе, но я не могу создать раздел кода, поэтому я пишу код и заказываю тег «br» html.


VPHYSICS::VPHYSICS(){
       m_tickflowed = 0;
       QueryPerformanceFrequency(&cpu_freq);
       SetTickTime(30);

       m_state[VPHYSTATE_SPEED_MAX]=SPEED_SCALAR_MAX;
       m_state[VPHYSTATE_LIMITED_ACCELARATION]=FALSE;
       m_state[VPHYSTATE_FRICTIONENABLE]=TRUE;
       m_state[VPHYSTATE_FRICTIONFACTOR]=1.0f;
       m_state[VPHYSTATE_GRAVITY]=9.8065f;
       m_state[VPHYSTATE_ENGINESPEED_DELAY_HIGH]=0.0f;
       m_state[VPHYSTATE_ENGINESPEED_DELAY_LOW]=0.0f;
       m_state[VPHYSTATE_FRICTION_RATIO]=1.0f;
       m_state[VPHYSTATE_DIMENSION_GLOBAL]=2;
       m_state[VPHYSTATE_COLLISION_UNFRICTIONABLE]=TRUE;
       m_state[VPHYSTATE_PAULI_EXCLUSION_ENABLE]=TRUE;
       m_state[VPHYSTATE_PAULI_EXCLUSION_RATIO]=1.0f;
       m_state[VPHYSTATE_FRICTION_SMOOTHLY]=1.0f;
       m_state[VPHYSTATE_COLLHANDLER_OUTER]=TRUE;
       m_dwSuspendedCount=0;
       InitializeCriticalSection(&m_criRegister);
       InitializeCriticalSection(&cri_out);
       ZeroMemory(m_objs,sizeof(m_objs));
       m_bThreadDestroy=FALSE;
       m_hPhysicalHandle=0;
       m_nPhysicalThread1ID=0;
       m_nTimeMomentTotalCount=0;
       m_hGarbageCollector=0;
       m_nGarbageCollectorID=0;
       m_PhyProcessIterID=NULL;
       for(DWORD i = 1 ; i < MAX_OBJECT_NUMBER ; i++)
       {
           m_objAvaliable.push_back(i);
       }
  }

// этот код - моя статическая библиотека, использующая физический движок игры.

и проблема в том, чтобы уничтожить этот инстаграм.
когда оператор удаления вызывает (в конце программы), это занимает очень много времени.
когда я снимаю

for(DWORD i = 1 ; i < MAX_OBJECT_NUMBER ; i++)
    {
        m_objAvaliable.push_back(i);
    }

или уменьшите MAX_OBJECT_NUMBER (первоначально это было #, определите MAX_OBJECT_NUMBER 100000 , но я уменьшил его до 5 или 10), «долгое время» исчезло !!

тип m_objAvaliable: std :: list
эта переменная-член не вызывает утечки памяти. (потому что этот контейнер не имеет никакого отношения к выделению кучи)
и другой проект, включая эту библиотеку, не имеет этой проблемы.
(но включается в проект mfc впервые, и я вижу только эту проблему в этом случае)
Кто-нибудь представляет решение этой проблемы ???
если вам нужна дополнительная информация, прокомментируйте эту статью. я отвечу как можно скорее
более того: это происходит только в режиме отладки. в режиме Release эта проблема не возникает.

1 Ответ

0 голосов
/ 26 октября 2011

Я полагаю, что проблема, с которой вы столкнулись, на самом деле не является проблемой вообще.MFC использует свою собственную отладочную версию new (в режиме выпуска она использует обычную, по умолчанию new).MFC делает это, поэтому он может попытаться помочь вам сообщить, что у вас есть утечки памяти.

Проблема в том, что я думаю, что ваше освобождение объектов в статической библиотеке происходит после MFCрешил сбросить любые ассигнования, которые, по его мнению, не были должным образом освобождены.Учитывая, что у вас так много объектов, он тратит ужасно много времени на выгрузку этих вещей в консоль.

В конце концов, MFC считает, что утечки памяти возникают, когда их нет.

Ваши решения:

  1. Остановите MFC с помощью DEBUG NEW.Удалите все строки в вашем проекте MFC, которые #define new DEBUG_NEW.Недостатком этого метода является то, что, конечно, если вы непреднамеренно создаете реальные утечки памяти, он не может их отследить.

  2. Имеют какие-то функции инициализации, деинициализации в вашемстатическая библиотека.Вызовите функцию деинициализации при выходе из приложения MFC, до того, как MFC начнет тралить через выделения, которые он все еще считает существующими.

...