Если вы хотите поймать (или иметь хороший шанс уловить) утечку глобальных объектов, попробуйте установить флаг отладки CRT _CRTDBG_LEAK_CHECK_DF в начале main. Флаг вызывает дамп обнаруженных утечек после глобальных деструкторов.
Чтобы ответить на ваши вопросы:
Разве я не должен получать предупреждение, так как моя программа вышла (сразу после _CrtDumpMemoryLeaks ()), и все еще оставался новый символ, который не был удален?
Дайте определение «предупреждение». Вызов _CrtDumpMemoryLeaks()
должен сбрасывать все, что в данный момент не выполнено. Ваша программа, выходящая после этого, не будет делать другой дамп, если это не настроено.
Как я могу обнаружить эти утечки памяти?
Они должны быть правильно обнаружены при условии, что вы используете отладочную CRT и правильно настроили _Crt
конфигурацию, которая в большинстве случаев есть по умолчанию.
Следующий код настраивает _Crt
систему дампа для создания дампа всех объектов по запросу и прямо перед окончательным выходом (после завершения main()
и уничтожения глобальной статики).
class MyLeak
{
public:
MyLeak() { new unsigned char[1024]; }
char * NewChar() { return new char[1024]; }
};
MyLeak myLeak;
int main(int argc, char *argv[])
{
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpFlag);
_CrtMemState ms = {0};
_CrtMemCheckpoint(&ms);
char *ptr = myLeak.NewChar();
_CrtMemDumpAllObjectsSince(&ms);
OutputDebugString("Exiting main()\n");
return EXIT_SUCCESS;
}
Журнал вывода отладки
Dumping objects ->
{69} normal block at 0x000000000048B800, 1024 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Exiting main()
Detected memory leaks!
Dumping objects ->
{69} normal block at 0x000000000048B800, 1024 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{68} normal block at 0x000000000048B390, 1024 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Обратите внимание, что в первом дампе записывается только внутреннее распределение, поскольку я использовал контрольную точку, а затем вызов dump-Since. Второй дамп (вызываемый после завершения main()
) по-прежнему записывает их оба, поскольку они оба еще не обработаны.
То, что у вас происходит утечка дампа после вашего динамического распределения (которое предоставлено объектом в глобальном пространстве памяти, но это не имеет ничего общего с распределением, это просто код, выделяющий память и возвращающий ее вам), не выглядит правильным. Вы должны получать дамп объекта всех невыполненных распределений CRT при любом _CrtDumpMemoryLeaks()
вызове с начала программы.
person
WhozCraig
schedule
28.01.2013
anotherPointer
- то же самое, что удаление с помощьюcharPointer
, и вы должны выполнить только одно из них. - person molbdnilo   schedule 28.01.2013