aminought
@aminought

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

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


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

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

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

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

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

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

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

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

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

Похожие вопросы