В C ++ нет базового «класса исключений»: вы можете выбросить что угодно, даже int
(throw 42;
вполне допустимо).
Если вы говорите о классе std::exception
, в нем очень мало: ни одна из его функций-членов на самом деле ничего не должна делать (what()
просто должен возвращать указатель на некоторую строку C). Следующее будет полностью правильной реализацией:
struct exception {
exception() throw() { }
exception(const exception&) throw() { }
exception& operator=(const exception&) throw() { }
virtual ~exception() throw() { }
virtual const char* what() const throw() { return "o noez! an exception!"; }
};
Классы исключений в стандартной библиотеке, которые позволяют указывать собственную строку (например, std::runtime_error
), используют std::string
. Им не нужно делать никакого ручного управления памятью, потому что они могут использовать std::string
. (Технически, реализация не должна использовать std::string
для внутреннего использования, но она должна брать один в своем конструкторе.)