Как проверить освобождение памяти - PullRequest
11 голосов
/ 10 ноября 2010

Как проверить, была ли память, на которую указывает указатель p, успешно освобождена?

Ответы [ 7 ]

12 голосов
/ 10 ноября 2010

В двух словах: вы не можете.

Ознакомьтесь с такими инструментами, как Valgrind , которые помогут отладить проблемы утечки памяти.

Некоторые другие вещи, которые вы должны учитывать:

  • Используйте умные указатели, чтобы не задумываться об управлении памятью,
  • Установите ваши указатели на 0 после того, как вы их освободите, чтобы дальнейшие delete не действовали,
  • Используйте стандартные классы (vector, ...) вместо собственных,
  • Наконец, не используйте указатели (на самом деле вы почти можете)
5 голосов
/ 10 ноября 2010

Извините, очень короткий ответ "Вы не можете"

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

Определите успешно! Определите освобожденный!

После освобождения памяти (свободной или удаленной) вы больше не должны использовать этот указатель. Все остальные предположения не имеют значения.

В конце концов, вы вызываете среду выполнения C / C ++ для освобождения памяти, но среда выполнения C / C ++ также вызывает функции операционной системы для освобождения страницы. Вы могли бы даже иметь собственный распределитель памяти поверх среды выполнения C / C ++, например, использует кэширование для реализации более быстрого алгоритма выделения памяти.

Все эти слои могут оставить для себя освобожденную память (из-за фрагментации или просто потому, что им нравится хранить ее при себе) или могут дать указание нижележащему слою удалить ее. Может случиться что угодно, только не используйте этот указатель.

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

Используйте IBM рациональное средство очистки для проверки правильного освобождения памяти.

1 голос
/ 31 октября 2012

Обработка исключений.Т.е. пробовать / ловить блоки.

1 голос
/ 10 ноября 2010
  1. Некоторые инструменты, выполняющие статический анализ кода, могут указывать на некоторые проблемы, связанные с освобождением памяти.
  2. Используйте valgrind для проверки наличия утечек памяти
  3. Избегайте необработанных указателей - используйте умныеуказатели вместо
0 голосов
/ 10 ноября 2010

В C ++ можно смело предполагать, что освобождение никогда не завершится неудачей. Деструкторы не должны выбрасывать исключения, и реальная зарезервированная память никогда не должна освобождаться, поэтому, учитывая эти два момента, ничто не может пойти не так.

Однако, если вы удалите указатель, который уже был удален, ваша программа, вероятно, вылетит. Это не проблема с самим освобождением - оригинальный delete работал успешно. Это проблема с управлением памятью вашей программы, если она пытается удалить указатель дважды, но это редко требуется для современных STL и интеллектуальных указателей, таких как std::vector, std::unique_ptr и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...