Ответ от @Vinzenz несколько на месте, но я постараюсь дать все подробности. У вас в основном есть два варианта: либо сделать отладочную среду выполнения дампом утечки, когда программа выйдет (это можно сделать, включив отчет об утечке памяти, вызвав _CrtSetDbgFlag с флаговым значением, которое имеет бит бит _CRTDBG_LEAK_CHECK_DF
), или как упомянутый звонок _CrtDumpMemoryLeaks()
сбросьте утечки в произвольной точке выполнения. Поскольку ваш пример не делает ни одной из этих вещей, вы ничего не получаете.
Что нужно знать о _CrtDumpMemoryLeaks()
, что он будет выгружать распределения кучи, которые не были освобождены в момент, когда он вызывается, поэтому любые интеллектуальные указатели (и все другие объекты, которые выделяют кучную память внутри), которые не были уничтожены, будут сбрасывается в этот момент. Вот почему использование флага отчета несколько лучше, так как оно запускается после завершения выполнения программы, поэтому все объекты, которые должны быть уничтожены, уничтожаются.
Что касается DBG_NEW
, он дает вам дополнительную информацию о линии, показывающую линию, вызвавшую утечку. Без него вы получите вывод, как в примере в вопросе, с ним вы получите номер строки, вызвавшей это (см. Пример ниже).
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
/*
Without the DBG_NEW you get something like, no line info
Detected memory leaks!
Dumping objects ->
{74} normal block at 0x00000000005D6520, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete
With it you get
Detected memory leaks!
Dumping objects ->
strcattest.cpp(36) : {74} normal block at 0x00000000002C6520, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
*/
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__)
#define new DBG_NEW
#endif
#endif // _DEBUG
int main(int argc, char* argv[])
{
// Enable automatic memory leak reporting at the end of the program, the next 3 lines can be skipped if _CrtDumpMemoryLeaks() is called somewhere
int current_flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
current_flags |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(current_flags);
char *memleak= new char[100];
_CrtDumpMemoryLeaks(); // Trigger dumping the leaks at this point
return 0;
}
Спасибо за подробный ответ ... Теперь я задаюсь вопросом, почему он работал со старой версии: -/ – nobs
@nobs что ты имеешь в виду старую версию? –
Мы использовали VS 2005 с тем же кодом Там у нас были сообщения. не знаю, что изменилось, но я не собираюсь снова выкапывать старую версию – nobs