Предположим, у нас есть программа, в которой мы выделяем некоторую память, а затем имеем утверждать Скажите несколько строк после. Если утверждать операторы и ошибки, что происходит с выделенной памятью? Получается ли это бесплатно перед остановкой программы?
assert
при неудаче пишет ошибку STDERR и звонки прервать (). который в отличие от выход() не выполняет функции, зарегистрированные в atexit (), и при этом это не называет деструкторами.
Следовательно, ни один из ваших деструкторов, кода очистки и т. Д. Не может быть вызван. Так что это зависит от ОС, так как память не освобождается программой до еенеожиданныйпрекращение.
Это наверное по дизайну, так как вызов деструкторов может привести к некоторой дальнейшей ошибке. Он завершается при неудачном утверждении, не выполняя никакого дополнительного кода.
Память остается выделенной как assert
неудача сбивает вашу программу.
Как часть процесса уничтожения, любая современная настольная ОС будет восстанавливать память. Некоторые встроенные операционные системы могут быть не в состоянии сделать это, хотя у меня нет названия одной под рукой.
Таким способом вы можете обнаружить память, которую должна освободить ОС, с помощью утилиты, такой как Valgrind.