From 4c6906f2cfc933eb6e29d24dfdd475041c3c1c43 Mon Sep 17 00:00:00 2001 From: eastcard Date: Thu, 5 Jun 2025 21:20:22 +0300 Subject: [PATCH 1/3] 08_exceptions typos --- src/08_exceptions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/08_exceptions.md b/src/08_exceptions.md index f3bd3ce..d0d7def 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`. From 28dee6b5feff8533071d7484a6462125800f161b Mon Sep 17 00:00:00 2001 From: eastcard Date: Thu, 5 Jun 2025 23:19:23 +0300 Subject: [PATCH 2/3] 11_undefined_behaviour example fix --- src/11_undefined_behaviour.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 переменную нельзя } ``` From 59870c55944ab50ea0650bed7844d9e939dfff8e Mon Sep 17 00:00:00 2001 From: eastcard Date: Fri, 6 Jun 2025 14:48:17 +0300 Subject: [PATCH 3/3] 08_exceptions typo --- src/08_exceptions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/08_exceptions.md b/src/08_exceptions.md index d0d7def..5296d05 100644 --- a/src/08_exceptions.md +++ b/src/08_exceptions.md @@ -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`.