diff --git a/src/08_exceptions.md b/src/08_exceptions.md index f3bd3ce..5296d05 100644 --- a/src/08_exceptions.md +++ b/src/08_exceptions.md @@ -136,7 +136,7 @@ catch (const type& e) { - **Ограниченная память**\ Сложность разработки *unwinder*'а в том, что он почти не может выделять память, потому что любое выделение может вызвать исключение. То есть он не может использовать почти никаких структур данных. - А ещё, информация про то, как расручивать стэк, которая хранится в файле, лежит не в том виде, которым удобно пользоваться, а в том, который занимает мало места. + А ещё, информация про то, как раскручивать стэк, которая хранится в файле, лежит не в том виде, которым удобно пользоваться, а в том, который занимает мало места. - Плюсовая поддержка исключений основана на языконезависимой поддержке (**Itanium ABI**).\ A **Itanium ABI** поддерживает такую фичу как *resumable* исключения. @@ -149,7 +149,7 @@ catch (const type& e) { По стандарту, это ошибка в программе: **считается, что в ситуации, когда вы получили 2 исключения, происходит что-то невообразимо ужасное, и в программе вызывается `std::terminate` — экстренное завершение программы**. Более простой способ получить `std::terminate` — выкинуть исключение в `main`. -Кстати, поскольку деструкторы не должны бросать исключение, такие функции как `free` явно в языке помечены как неспособные бросать исключения. Чтобы пометить так функцию, есть модификатор `noexcept` **Бросание исключений из `noexcept` таких функций также приводит к `std::terminate`**. Ещё помимо `noexcept` можно указать `noexcept(/* булевое выражение */`). Это нужно, если вы [шаблонный код](./14_templates.md) пишете, и у вас функция может в зависимости от шаблона либо быть `noexcept`, либо нет. +Кстати, поскольку деструкторы не должны бросать исключение, такие функции как `free` явно в языке помечены как неспособные бросать исключения. Чтобы пометить так функцию, есть модификатор `noexcept`. **Бросание исключений из `noexcept` таких функций также приводит к `std::terminate`**. Ещё помимо `noexcept` можно указать `noexcept(/* булевое выражение */)`. Это нужно, если вы [шаблонный код](./14_templates.md) пишете, и у вас функция может в зависимости от шаблона либо быть `noexcept`, либо нет. И вот что важно знать — **деструкторы по умолчанию `noexcept`**. Если вам нужно это исправить — `noexcept(false)`. Тогда при обычном бросании исключения в деструкторе всё будет хорошо, а при двойном исключении — всё ещё `std::terminate`. diff --git a/src/11_undefined_behaviour.md b/src/11_undefined_behaviour.md index f55e66b..4730b1d 100644 --- a/src/11_undefined_behaviour.md +++ b/src/11_undefined_behaviour.md @@ -110,7 +110,8 @@ void good() void bad() { int const a = 42; - int& ref = const_cast(ref1); // Это не UB. Это так, чтобы, например, можно было вызвать функцию, на которой ошибочно не поставили const + int const& ref1 = a; + int& ref2 = const_cast(ref1); // Это не UB. Это так, чтобы, например, можно было вызвать функцию, на которой ошибочно не поставили const ref2 = 43; // UB, менять const переменную нельзя } ```