Здравствуйте, Аноним, Вы писали:
А>1. Mожно ли так делать (передавать указатель на локальный буфер)?
Нет, нельзя.
Локальный буфер будет создан на стеке, как только программа обнаруживает исключение, она начинает последовательно разрушать объекты стека до тех пор, пока не встретит обработчик данного исключения. Локальный буфер будет уничтожен практически в самом начале.
А>2. Не нравится необходимость иметь массив на стеке, тем более заранее неизвестен размер. Как сделать кошерно?
Вообще, лучший вариант — создать наследника своего стандартного исключения и работать с ним ( к примеру, std::runtime_error).
Если очень хочется именно строку — std::string
А если char*, то std::shared_ptr<char*> — это гарантирует, что динамически созданная строка в любом случае, будет уничтожена.