_CrtDumpMemoryLeaks () == 1 в первой строке кода? - PullRequest
2 голосов
/ 17 ноября 2010

Я работаю над проектом MFC Visual C ++.Как я понимаю из MSDN , _CrtDumpMemoryLeaks() должен возвращать TRUE при утечках памяти.

После того, как он заметил is TRUE, я попытался найти первоеуказать в коде, где он становится истинным.Очевидно, это правда с самого начала.Если я нажму F10 (пошаговое управление), чтобы начать отладку программы, и введу _CrtDumpMemoryLeaks() в окне просмотра, оно показывает ИСТИНА еще до первой строки кода, в точке входа в программу:

extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                _In_ LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{
    // call shared/exported WinMain
    return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}

Кроме того, я предположил, что, возможно, средства отладки не инициализируются в этот момент и что ИСТИНА ошибочна.Поэтому я установил точку останова в первой строке функции OnInitDialog() и там тоже значение TRUE.

Почему у меня возникают утечки памяти в начале программы?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2010

Вы неверно истолковали возвращаемое значение.TRUE не означает утечку памяти, это означает, что в куче есть несколько невыпущенных блоков, на которые могут указывать некоторые указатели в программе.Эти объекты могут быть созданы с помощью кода запуска CRT и конструкторов статических объектов.

Если вы по-прежнему подозрительны - установите хук выделения и проверьте, когда объекты создаются.Чтобы сделать это достаточно рано, вам понадобится объект, созданный при запуске - для этого используйте #pragma init_seg( compiler ).

2 голосов
/ 17 ноября 2010

C ++ инициализирует статические объекты перед вызовом метода main () (или WinMain, если это так).

У вас есть где-нибудь статические объекты?Вы используете Singleton для инициализации какого-либо объекта, который никогда не освобождается?Используете ли вы какие-то рамки, которые могли бы сделать это за вашей спиной?

1 голос
/ 17 ноября 2010

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

Вы можете попробовать установить точку останова в HeapAlloc () - вы, вероятно, увидите, что она получает удар раньше, чем winmain.

...