Бросить подвох в реализации пространств имен
Вопрос удален: тупой. Полученные ответы были слишком острыми или не удавались на месте для такого тупого опроса.
1 ответ
Золотое правило при использовании исключений в C++ - "бросить по значению, поймать по константной ссылке".
В quotient()
, когда ты сказал
throw new string("divide by zero!");
вы создаете новую строку в куче, которая никогда не освобождается при возникновении исключения. Вместо этого вы должны просто сказать
throw string("divide by zero!");
который будет выделять новую строку вместо стека.
Позже, когда в вашем блоке catch, вы должны ловить по константной ссылке, т.е.
catch (const string& str) {
// ...
}
Причина этого в основном техническая: константная ссылка может связываться с rvalue, тогда как изменяемая ссылка не может, и для захвата по значению может потребоваться копия строки.
Или, возможно, взглянуть на это по-другому: цель исключения - сообщить причину, по которой что-то не получилось. Эта причина не изменится, как только это произойдет, поэтому исключение следует рассматривать как const
после создания.