Подтвердить что ты не робот

Как проверить освобождение памяти

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

4b9b3361

Ответ 1

В нескольких словах: вы не можете.

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

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

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

Ответ 2

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

Ответ 4

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

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

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

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

Ответ 5

  • Некоторые инструменты, которые выполняют статический анализ кода, могут указывать на некоторые проблемы, связанные с освобождением памяти.
  • Используйте valgrind для проверки наличия утечек памяти.
  • Избегайте необработанных указателей - вместо этого используйте интеллектуальные указатели.

Ответ 6

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

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

Ответ 7

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