1

それらの機能は正しく実装されていますかnoexcept/throw()

最初の機能

void do_something(const std::string s) noexcept{
    // do something with no exception
}

do_something("Hello");

"Hello" literal新しいstd::stringオブジェクトを作成し、例外をスローする可能性があります。

この例外は、関数の外側または内側のどちらでスローされますか?

2 番目の関数:

size_t do_something(const char *s) noexcept{
    return strlen(s);
}

do_something(nullptr);

strlenが選択されているのは、レガシーC関数であり、クラッシュするためsですnullprt

ただし、このクラッシュは例外とは関係ありません。仮定は正しいですか?

4

1 に答える 1

4

の:

void do_something(const std::string s) noexcept

引数sは、呼び出し元によって構築されます。つまり、構築中に例外がスローさstd::stringれた場合、その例外はdo_somethingが呼び出される前にスローされます。


strlenが選択されているのは、これがレガシー C 関数であり、クラッシュするためsですnullptr

技術的には、無効なポインタを介してメモリにアクセスすると、未定義の動作が発生します。このような場合、C++ 例外はスローされず、コンパイラ/ランタイムはそれを検出する必要はありません。

をスローする Java とは異なりますNullPointerException。ヌル ポインターの Java チェックは安価かもしれませんが、無料ではありません。

SIGSEGVLinux/Unix では、デフォルトの動作がプロセスを終了するシグナルを受け取る可能性が最も高くなります。独自のシグナル ハンドラーをインストールして C++ 例外をスローするようにすることもできますが、その場合、さらに未定義の動作が発生します。

したがって、コードが修正されるように、できるだけ早く大きな音でクラッシュするのが最善です。

ただし、このクラッシュは例外とは関係ありません。仮定は正しいですか?

正解です。クラッシュも例外ではありません。ただし、クラッシュは例外によって引き起こされる可能性があります。

于 2015-09-24T07:57:47.240 に答える