Этот пост - перевод статьи Герба Саттера: GotW #102: Exception-Safe Function Calls.
Есть ли в этом коде проблемы с безопасностью относительно исключений или любые другие проблемы? Объясните.
3. Продолжая изучать старый код, вы обнаруживаете, что кому-то не нравился код, приведенный в примере 2, и позднее он был изменен на:
Какие улучшения привнес новый подход относительно старого (и привнес ли вообще)? Остались ли проблемы с безопасностью относительно исключений? Объясните.
4. Покажите, как можно реализовать функцию make_unique, которая бы решала проблемы с безопасностью в примере 3, и которую можно было бы вызывать следующим образом:
Простой вопрос
1. Что вы можете сказать о порядке выполнения функций f, g и h и выражений expr1 и expr2 в приведенных ниже фрагментах кода? Предпалагается, что expr1 и expr2 не содражат в себе вызовов других функций.// Пример 1(a) // f( expr1, expr2 );
// Пример 1(b) // f( g( expr1 ), h( expr2 ) );
Вопросы посложнее
2. Разбирая доставшийся вам в наследство код, вы наткнулись на следующий фрагмент:// Пример 2 // В заголовочном файле: void f( T1*, T2* ); // В месте вызова: f( new T1, new T2 );
3. Продолжая изучать старый код, вы обнаруживаете, что кому-то не нравился код, приведенный в примере 2, и позднее он был изменен на:
// Пример 3 // В заголовочном файле: void f( std::unique_ptr<T1>, std::unique_ptr<T2> ); // В месте вызова: f( std::unique_ptr<T1>{ new T1 }, std::unique_ptr<T2>{ new T2 } );
4. Покажите, как можно реализовать функцию make_unique, которая бы решала проблемы с безопасностью в примере 3, и которую можно было бы вызывать следующим образом:
// Пример 4 // В заголовочном файле: void f( std::unique_ptr<T1>, std::unique_ptr<T2> ); // В месте вызова: f( make_unique<T1>(), make_unique<T2>() );