Утечки памяти VC2008 C++
Пожалуйста, обратите внимание, что мой уровень владения английским очень низок. но я постараюсь объяснить.
Я сделал проект 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 (запуск - статическое время, перед основным)
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);
}
}
// этот код - моя статическая библиотека, использующая Physics Engine of Game.
и проблема в том, когда уничтожаем этот инстаграм.
когда оператор удаления вызывает (в конце программы), это занимает очень много времени.
когда я уберу
for(DWORD i = 1 ; i < MAX_OBJECT_NUMBER ; i++)
{
m_objAvaliable.push_back(i);
}
или уменьшите MAX_OBJECT_NUMBER(изначально это был #define MAX_OBJECT_NUMBER 100000, но я уменьшил его до 5 или 10), "долгое время" исчезло!!
тип 'm_objAvaliable' является std::list
эта переменная-член не вызывает утечки памяти. (потому что этот контейнер не имеет никакого отношения к выделению кучи)
и другой проект, включая эту библиотеку, не имеет этой проблемы.
(но включается в проект MFC впервые, и я вижу только эту проблему в этом случае)
Кто-нибудь представляет решение этой проблемы???
Если вам нужна дополнительная информация, прокомментируйте эту статью. я отвечу как можно скорее
больше: это происходит только в режиме отладки. в режиме Release эта проблема не возникает.
1 ответ
Я считаю, что проблема, с которой вы столкнулись, на самом деле не является проблемой вообще. MFC использует свою собственную отладочную версию new
(в режиме релиза он использует обычный, по умолчанию new
). MFC делает это, чтобы попытаться предупредить вас о наличии утечек памяти.
Проблема в том, что я думаю, что освобождение объектов в статической библиотеке происходит после того, как MFC решил сбросить все выделения, которые, по его мнению, не были должным образом освобождены. Учитывая, что у вас так много объектов, он тратит ужасно много времени на вывод всего этого на консоль.
В конце концов, MFC считает, что утечки памяти, когда их нет.
Ваши решения:
Остановите MFC с помощью DEBUG NEW. Удалите все строки в вашем проекте MFC, которые
#define new DEBUG_NEW
, Недостаток этого метода заключается в том, что, если вы случайно создадите реальные утечки памяти, он не сможет их отследить.Имейте некоторые виды функций инициализации, деинициализации в вашей статической библиотеке. Вызовите функцию деинициализации при выходе из приложения MFC, до того, как MFC начнет тралить через выделения, которые он все еще считает существующими.