使用 noexcept C++11 正确实现函数
Proper implementation of functions with noexcept C++11
这些函数是否正确实现了 noexcept
/ throw()
第一个函数
void do_something(const std::string s) noexcept{
// do something with no exception
}
do_something("Hello");
"Hello" literal
将创建新的 std::string
对象,它可能会抛出异常。
这个异常是在函数外抛出还是在函数内抛出?
第二个函数:
size_t do_something(const char *s) noexcept{
return strlen(s);
}
do_something(nullptr);
选择 strlen
是因为它是遗留的 C
函数并且会崩溃,因为 s
是 nullprt
.
然而这次崩溃与异常无关。假设是否正确?
在:
void do_something(const std::string s) noexcept
参数s
由调用者构造。也就是说,如果构造 std::string
抛出异常,则在调用 do_something
之前抛出该异常。
strlen
is chosen because it is legacy C function and it will crash, because s
is nullptr
.
从技术上讲,通过无效指针访问内存会导致未定义的行为。在这种情况下不会抛出 C++ 异常,并且不需要 compiler/run-time 来检测它。
不像 Java 抛出 NullPointerException
。那些 Java 空指针检查可能很便宜,但它们不是免费的。
在 Linux/Unix 上,您最有可能收到 SIGSEGV
信号,其默认行为是终止进程。您可以安装自己的信号处理程序并使其抛出 C++ 异常,但这会导致更多未定义的行为。
所以,最好是尽早崩溃并大声崩溃,以便修复代码。
However this crash is nothing to do with exceptions. Is the assumption correct?
正确,崩溃也不例外。崩溃可能是由异常引起的。
这些函数是否正确实现了 noexcept
/ throw()
第一个函数
void do_something(const std::string s) noexcept{
// do something with no exception
}
do_something("Hello");
"Hello" literal
将创建新的 std::string
对象,它可能会抛出异常。
这个异常是在函数外抛出还是在函数内抛出?
第二个函数:
size_t do_something(const char *s) noexcept{
return strlen(s);
}
do_something(nullptr);
选择 strlen
是因为它是遗留的 C
函数并且会崩溃,因为 s
是 nullprt
.
然而这次崩溃与异常无关。假设是否正确?
在:
void do_something(const std::string s) noexcept
参数s
由调用者构造。也就是说,如果构造 std::string
抛出异常,则在调用 do_something
之前抛出该异常。
strlen
is chosen because it is legacy C function and it will crash, becauses
isnullptr
.
从技术上讲,通过无效指针访问内存会导致未定义的行为。在这种情况下不会抛出 C++ 异常,并且不需要 compiler/run-time 来检测它。
不像 Java 抛出 NullPointerException
。那些 Java 空指针检查可能很便宜,但它们不是免费的。
在 Linux/Unix 上,您最有可能收到 SIGSEGV
信号,其默认行为是终止进程。您可以安装自己的信号处理程序并使其抛出 C++ 异常,但这会导致更多未定义的行为。
所以,最好是尽早崩溃并大声崩溃,以便修复代码。
However this crash is nothing to do with exceptions. Is the assumption correct?
正确,崩溃也不例外。崩溃可能是由异常引起的。