2010-11-10 6 views
11

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

+0

Необходима более подробная информация: как первоначально была выделена память? и * почему * вам нужно проверить, было ли оно освобождено? –

+0

На прикладном уровне он не может. Если, однако, вы работаете на очень низком уровне уровней ядра, могут быть способы сделать это. – Chubsdad

+1

Yeap, какова реальная проблема, которую вы пытаетесь решить? – sharptooth

ответ

12

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

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

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

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

Как настроить указатели на 0 с помощью этой проблемы? –

+0

Чтобы избежать двойных проблем. Это может быть то, что хочет в конце концов. –

+0

Слишком плохой настройкой указателей на 0 является UB. –

5

К сожалению, очень короткий ответ «Вы не можете»

2

Используйте инструмент IBM rational purify, чтобы проверить правильность освобождения памяти.

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

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

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

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

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

0

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

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

0

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

+5

Неверно; деструктор не должен генерировать исключение, поэтому это ничего не сделает. –

+0

хорошо пункт. Благодарю. –

Смежные вопросы