В настоящее время я ударяю головой о школьное задание и имею дело с довольно неприятными утечками памяти. Во время отладки я сузил часть проблемы до одного фрагмента кода.Почему этот код создает утечку памяти?
Вот чрезвычайно упрощенная версия того кода, который я переделан, чтобы проиллюстрировать утечку:
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
do {
char *name = new char;
char *cname = new char[10];
cin >> cname;
name = cname;
delete [] name;
} while(false);
_CrtDumpMemoryLeaks();
Так что мой вопрос, почему это производит утечку памяти? Я пробовал кучу вещей, чтобы исправить это, но ничего не работает.
EDIT:
Ах, кажется, что я недопонимание, как указатели работают. По какой-то причине я был в предположении, что указатель, инициализированный без значения, указывает на NULL, а не блок памяти, и поэтому его не нужно обрабатывать.
Простые вопросы получают простые ответы. Спасибо.
'символ * имя = nullptr' будет указывать без памяти, но вызов' new' выделяет память (и, следовательно, должно быть высвобождено) – Tas
Вы выделяете char, выделите 10 символов, сделайте что-нибудь, удалите 10 символов, но никогда не удаляйте один символ (который вам фактически не нужно выделять, но вы это сделали). – immibis