Как проверить, успешно ли освобождена память, для которой точки указателя p успешно удалены?Как проверить освобождение памяти
ответ
В нескольких словах: вы не можете.
Ознакомьтесь с такими инструментами, как Valgrind, чтобы помочь вам отладить проблемы с утечками памяти.
Некоторые другие вещи, которые вы должны рассмотреть следующие вопросы:
- Используйте смарт-указатели, так что вам не придется делать думать об управлении памятью,
- Установите указатели на 0 после того, как вы освободите их, так что дальнейшее
delete
не имеет никакого эффекта, - Используйте стандартные классы (
vector
, ...) вместо того, чтобы добавить собственные, - Наконец, не следует использовать указатели (на самом деле вы можете почти)
Как настроить указатели на 0 с помощью этой проблемы? –
Чтобы избежать двойных проблем. Это может быть то, что хочет в конце концов. –
Слишком плохой настройкой указателей на 0 является UB. –
К сожалению, очень короткий ответ «Вы не можете»
Используйте инструмент IBM rational purify, чтобы проверить правильность освобождения памяти.
- Некоторые инструменты, которые выполняют статический анализ кода, могут указывать на некоторые проблемы, связанные с освобождением памяти.
- Используй Valgrind, чтобы проверить, есть ли у вас утечка памяти
- Избегайте сырые указатели - использовать смарт-указатели вместо
Определить успешно! Определить освобожденный!
После освобождения памяти (независимо от того, является ли она свободной или удаленной), вы не должны снова использовать этот указатель. Все остальные предположения не имеют значения.
В конце концов вы вызываете среду выполнения C/C++ для освобождения памяти, но среда выполнения C/C++ также вызывает функции операционной системы для освобождения страницы. У вас может даже быть специальный распределитель памяти поверх среды выполнения C/C++, например, использует кеширование для реализации более быстрого алгоритма выделения памяти.
Все эти слои могут хранить освобожденную память для себя (из-за фрагментации или просто потому, что они любят держать ее сами) или могут сказать, что нижележащий слой освобождает ее. Все может случиться, просто не используйте этот указатель.
В C++ вы можете с уверенностью предположить, что освобождение никогда не сработает. Деструкторы не должны бросать исключения, и реальная сохраненная память никогда не должна быть освобождена, поэтому, учитывая эти две точки, ничто не может пойти не так.
Однако, если вы удалили указатель, который уже был удален, ваша программа, вероятно, сработает. Это не проблема с самораскрытием, хотя - оригинал delete
работал успешно. Это проблема с управлением памятью вашей программы, если она пытается дважды удалить указатель, но это редко необходимо для современных STL и интеллектуальных указателей, таких как std::vector
, std::unique_ptr
и т. Д.
Обработка исключений. То есть try/catch блоки.
Неверно; деструктор не должен генерировать исключение, поэтому это ничего не сделает. –
хорошо пункт. Благодарю. –
- 1. Освобождение памяти
- 2. Распределение памяти и освобождение памяти
- 3. освобождение памяти Java
- 4. Освобождение выделенной памяти
- 5. освобождение памяти выделено cudamallocpitch
- 6. Освобождение памяти в функции
- 7. TCL Освобождение памяти
- 8. Принудительное освобождение памяти ОС
- 9. Освобождение памяти CUDA Matlab
- 10. Освобождение памяти C++
- 11. dapper.net освобождение кэшированной памяти
- 12. Освобождение выделенной памяти
- 13. KnockoutJS Освобождение памяти
- 14. Освобождение памяти (если возможно)
- 15. Освобождение памяти QWebView
- 16. Освобождение памяти от переменных
- 17. Освобождение памяти объекта
- 18. освобождение памяти в трёх.js
- 19. Выход и освобождение памяти
- 20. Освобождение динамической памяти
- 21. Освобождение памяти от ресурса
- 22. освобождение памяти от структуры
- 23. cv :: Распределение памяти памяти и освобождение памяти
- 24. освобождение выделенной памяти
- 25. Освобождение памяти и исключения
- 26. Освобождение памяти QList
- 27. NewStringUTF() и освобождение памяти
- 28. Освобождение памяти перед перераспределением
- 29. Освобождение памяти Valgrind
- 30. Освобождение памяти после использования
Необходима более подробная информация: как первоначально была выделена память? и * почему * вам нужно проверить, было ли оно освобождено? –
На прикладном уровне он не может. Если, однако, вы работаете на очень низком уровне уровней ядра, могут быть способы сделать это. – Chubsdad
Yeap, какова реальная проблема, которую вы пытаетесь решить? – sharptooth