私自身の例外を派生しています。MyException
とstd::system_error
から電話し、メッセージを計算して返すためにwhat()
をオーバーライドしました。 MyException
の初期化子リストは、メッセージを受け取るsystem_errorコンストラクタオーバーライドを呼び出さない。std :: exceptionは何を所有していますか?
私はMyException
をキャッチし、std::exception
にstd::exception
にwhat()
を呼び出した結果を、それをコピーする場合はnullptr
です。意味あり。
MyException
の初期化時にメッセージを受け取るsystem_exceptionのコンストラクタを使用すると、system_errorがメッセージのコピーを取り、それを解放することが指定されていますか?
私はstd::exception
MyException
のコピーが有効なwhat()
を返すことができると仮定しています。 MyExceptions
の新しいものが作成されるたびに計算する必要があるという点でパフォーマンス・ヒットを取りますが、 what()が最初に呼び出されたときにだけ、それを怠惰に計算することはできません。
what()
がchar*
を返し、const std::string&
を返さないため、「what」文字列の所有権について少し気になります。
class MyException : public std::system_error
{
std::string what_;
public:
MyException(int errorValue, const std::error_category& category)
: std::system_error(errorValue, category)
{}
char* what() const
{
what_ = "MyException: " + to_string(code().value());
return what_.c_str();
}
};
int main()
{
std::exception ex;
try
{
throw MyException(4, system_category());
}
catch(const MyException& e)
{
ex = e;
}
printf("what= %s", ex.what());
return 1;
}
コードを表示してください。そして、「MyExceptionを捕捉してstd :: exceptionにコピーすると、例外オブジェクトがスライスされます。それが呼び出されるまで「what」の結果が存在しない可能性があります。 –
@RichardCrittenコードを追加しました。私はスライスを理解しています。 –
'std :: runtime_error'は文字列を所有しています。具体的には、 'std :: string'ではなく、変更不可能なref-counted文字列です。 – ildjarn