aminought
@aminought

Какие операции языка C++ могут быть потенциально небезопасны?

  • Присваивание.
  • Использование dynamic_cast для приведения ссылочных типов.
  • Создание экземпляра класса.
  • Неявное преобразование значений базовых типов.
  • Передача объекта-класса в функцию по значению.


Вопрос с несколькими вариантами ответа из курса по C++ от Mail.ru. Гадать не вижу смысла, поэтому выкладываю вопрос здесь вместе со своими мыслями. Вообще, мне бы сначала определиться, что значит - небезопасная операция? Насколько я понял, это операция, которая скомпилируется, но может как-то неправильно отработать.
Присваивание - безопасная операция, проверяется во время компиляции.
Использование dynamic_cast для ссылочных типов - выбрасывается исключение, значит небезопасная.
Создание экземпляра класса - может произойти утечка ресурсов, если в конструкторе возникнет исключение, да и память может кончиться - небезопасная.
Неявное преобразование - по определению небезопасная, нужна проверка типов.
Передача по значению - может не хватить памяти для копии объекта, небезопасная.
Ответ неверный. Я свои мысли рассказал, теперь прошу вашей помощи.
  • Вопрос задан
  • 318 просмотров
Решения вопроса 1
@nirvimel
Присваивание может быть перегружено, поэтому в общем случае может вызывать произвольный код, который может быть не безопасен, следовательно и сама операция не может считаться безопасной.

На счет преобразования значений базовых типов все не так однозначно, оно может приводить к ошибкам в программной логике (если не был предусмотрен какой-то краевой случай), но само по себе (как одиночное действие) не может вызывать исключений и неопределенного поведения, если операнды сами по себе корректны (не вызывают исключений при доступе).

В остальном приведенные рассуждения в целом верные, явных ошибок я не заметил.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Использование dynamic_cast для ссылочных типов - выбрасывается исключение, значит небезопасная.

Безопасная операция, т.к. исключение можно обработать.
Ответ написан
@koronabora
Человек
Спорно: Присваивание.
Да: Использование dynamic_cast для приведения ссылочных типов.
Да: Создание экземпляра класса.
Возможно: Передача объекта-класса в функцию по значению

При dynamic_cast вполне можно нарваться на нулевой указатель или на невозможность приведения.
При создании экземпляра может упасть конструктор или тупо не быть памяти.

При присваивании, в обычной жизни, проблем не должно быть, но, в принципе, их можно создать банальным переопределением операции присваивания.

При передаче по значению может быть отключен конструктор копирования, но это выясняется на этапе компиляции, а также, конечно, может не хватить памяти в стеке.

З.Ы. Насколько я понимаю, неявное преобразование базовых типов проверяется на этапе компиляции, если мы, конечно, не используем auto.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы