Re[3]: Detected memory leaks при вызове AfxFreeLibrary
От: Melamed Россия  
Дата: 13.05.09 11:45
Оценка:
Здравствуйте, Alex_Bukreev, Вы писали:

A_B>Здравствуйте, LMars, Вы писали:


LM>>Случайно это не из-за того, что код с ошибкой? Надо:


LM>>
LM>>    HMODULE hModule = AfxLoadLibrary( _T("MyDLL.dll") );
LM>>    int* p1 = new int[ 100 ];
LM>>    char* p2 = new char[ 321 ];
LM>>    AfxFreeLibrary( hModule );
LM>>    delete [] p1;
LM>>    delete [] p2;
LM>>


A_B>Да, я потом вспомнил что в таких случаях в delete надо ставить [], но они не помогли

A_B>Тем более видите, там утечки памяти показываются не только в тех местах, где я её явно выделяю. Кстати CDynLinkLibrary, это мне ясно, действительно такой объект создаётся в DllMain MFC extension DLL, не понятно только почему он два раза в memory leaks упоминается, ведь адрес один-то.

Глюк явно в DLL, которую вы загружаете, а точнее в функции DllMain, которая вызывается при загрузки и выгрузке динамической библиотеки. Наверняка при загрузки библиотеки создается элемент класса, а при выгрузке он не уничтожается, что ведет к утечки памяти в программе

Вот пример, как должна быть написана DllMain функция в библиотеки


Array2D *Temp;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        {
// Выполняется при загрузки библиотеки
            Temp = new Array2D;
            break;
        }
    case DLL_PROCESS_DETACH:
        {
// Выпольняется при выгрузке библиотеки
            delete Temp; 
            break;
        }
    }
    return TRUE;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.