обратите внимание, мой уровень владения английским очень низкий. но я сделаю все возможное, чтобы объяснить.
Я делаю проект 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 эта проблема не возникает.