Бросить подвох в реализации пространств имен

Вопрос удален: тупой. Полученные ответы были слишком острыми или не удавались на месте для такого тупого опроса.

1 ответ

Золотое правило при использовании исключений в C++ - "бросить по значению, поймать по константной ссылке".

В quotient(), когда ты сказал

throw new string("divide by zero!");

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

throw string("divide by zero!");

который будет выделять новую строку вместо стека.

Позже, когда в вашем блоке catch, вы должны ловить по константной ссылке, т.е.

catch (const string& str) {
    // ...
}

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

Или, возможно, взглянуть на это по-другому: цель исключения - сообщить причину, по которой что-то не получилось. Эта причина не изменится, как только это произойдет, поэтому исключение следует рассматривать как const после создания.

Другие вопросы по тегам