В следующем предполагается, что вы выдаваете исключение типа , описанного в этом вопросе .
Ваш тип исключения не работает.
В throw_exception
мы имеем эту строку:
text l_message;
Я не знаю, что такое text
, но я предполагаю, что это строковый класс. Я также предположу, что test::_char
- это просто причудливый способ сказать char
.
Итак, у нас есть объект стека l_message
, который имеет тип text
. Позже у нас есть эта строка:
throw exc((const text::_char *)l_message);
Поскольку вы не соизволили нам дать определение text
, опять же, я должен сделать предположение. Я предполагаю, что для text
определен operator text::_char*
, определенный для него, который возвращает указатель на строку в стиле C, представляющую сохраненные строковые данные, которая заканчивается на NULL.
Только есть одна проблема: этот указатель принадлежит l_message
.
В момент, когда l_message
падает со стека, указатель, возвращаемый l_message
, исчезает. Это было бы хорошо ... если бы класс exc
фактически скопировал эту строку во внутренний буфер. Но это не так. Он просто хранит указатель.
Указатель, который больше не указывает на действительную память. Это не очень хорошая идея.
Исключение должно быть автономным. Он должен владеть всей памятью, необходимой для того, что он должен делать.
Кроме того, вы не правильно унаследовали от std::exception
. В частности, вы должны перегрузить метод virtual const char* what() const throw()
. Опять же, я удивлен, что это позволило вам скомпилировать свой код без него.