Я недавно конвертировал программу с использованием сырых указателей на std::shared_ptr
и хотел убедиться, что не было утечки памяти. Я посмотрел на MSDN Обнаружение утечек памяти с помощью библиотеки CRT и следуйте инструкциям по настройке отчета.
Я начинаю с добавления этих строк в мой файл:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
и вызвать отчет с — _CrtDumpMemoryLeaks();
Я действительно использую new
выделить свою память так, как предлагает страница, я добавил …
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
без существенных изменений в плане более точного определения места утечки. Вместо этого мой отчет по-прежнему выглядит так:
Detected memory leaks!
Dumping objects ->
{158} normal block at 0x006F8458, 8 bytes long.
Data: < , > DC F6 2C 00 00 00 00 00
{155} normal block at 0x006FAD40, 40 bytes long.
Data: <L> > 4C 3E 17 01 03 00 00 00 01 00 00 00 CD CD CD CD
{154} normal block at 0x006FAB68, 16 bytes long.
Data: <d> > 64 3E 17 01 01 00 00 00 01 00 00 00 00 00 00 00
{149} normal block at 0x006FAC08, 40 bytes long.
Data: <L> > 4C 3E 17 01 03 00 00 00 01 00 00 00 CD CD CD CD
{148} normal block at 0x006FABB8, 16 bytes long.
Data: <d> > 64 3E 17 01 01 00 00 00 01 00 00 00 00 00 00 00
Object dump complete.
The program '[7152] List.exe' has exited with code 0 (0x0).
К сожалению, отчет генерируется непосредственно перед выходом, поэтому невозможно увидеть утечку в реальном времени.
Глядя на ответ на это вопрос Я заметил, что я не загружал файл pdb из-за того, что это пустой проект. Поэтому я последовал совету Вот которая исправила проблему с pdb, но не смогла решить мою проблему.
Приложение было сгенерировано из пустого консольного приложения, если это имеет значение, и я работаю от имени администратора.
Также я знаю о внешних инструментах, которые я мог бы использовать, но я часто использую компьютеры, для которых у меня нет разрешения на их добавление, поэтому правильное функционирование VS является идеальным решением. Любая помощь в получении отчета, показывающего номера строк утечек, будет отличной.
Я полагаю, логичный вопрос, который нужно задать, — если вы используете управляемые указатели, почему у меня все еще есть утечка памяти? Ну, я оставил пару локализованных указателей, которые являются только временными метками и т. Д., Которые, по-видимому, не должны были вызывать проблему. Итак, я чувствую, что знаю, где это происходит, но это такая простая программа, я хотел бы знать, как это сделать, чтобы я мог использовать ее на более крупных. Благодарю.
Вы должны убедиться, что определения и включение stdlib находятся перед любыми другими включениями в приложение.
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
Должно быть самой первой вещью в вашем приложении.
Других решений пока нет …