Я предполагаю runtime_error
в вашем коде выше относится к std::runtime_error
? В этом случае вы можете просто передать ему std::string
и освободить буфер. Например
int bufferLen = some_func_to_get_buff_len();
auto bufferText = std::unique_ptr<char[]> { new char[bufferLen + 1] };
some_func_to_get_text(bufferText.get(), bufferLen);
throw runtime_error({ bufferText.get(), bufferText.get() + bufferLen });
В качестве альтернативы, определите свой собственный тип исключения:
#include <utility>
#include <exception>
#include <memory>
class my_error : public std::exception
{
std::unique_ptr<char[]> msg;
public:
my_error(std::unique_ptr<char[]>&& msg) noexcept
: msg(std::move(msg))
{
}
const char* what() const noexcept override
{
return msg.get();
}
};
…
int bufferLen = some_func_to_get_buff_len();
auto bufferText = std::unique_ptr<char[]> { new char[bufferLen + 1] };
some_func_to_get_text(bufferText.get(), bufferLen);
throw my_error(std::move(bufferText));
Основным преимуществом определения ваших собственных типов исключений является то, что они позволяют обрабатывать ошибки такого типа отдельно. Дополнительным бонусом здесь будет то, что он также избегает копирования строки ошибки. Поскольку исключения должны происходить только в исключительных условиях, это не должно быть проблемой, хотя…