1

这些功能是否正确实现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功能并且会崩溃,因为sis nullprt

但是,此崩溃与异常无关。假设正确吗?

4

1 回答 1

4

在:

void do_something(const std::string s) noexcept

参数s由调用者构造。也就是说,如果构造std::string抛出异常,则在do_something调用之前抛出该异常。


strlen之所以选择它是因为它是遗留的 C 函数并且它会崩溃,因为sis nullptr.

从技术上讲,通过无效指针访问内存会导致未定义的行为。在这种情况下不会引发 C++ 异常,并且不需要编译器/运行时来检测它。

与抛出NullPointerException. 那些对空指针的 Java 检查可能很便宜,但它们不是免费的。

在 Linux/Unix 上,您最有可能收到SIGSEGV默认行为是终止进程的信号。您可以安装自己的信号处理程序并使其引发 C++ 异常,但这会导致更多未定义的行为。

因此,最好尽可能早地和大声地崩溃,以便修复代码。

但是,此崩溃与异常无关。假设正确吗?

正确,崩溃也不例外。但是,崩溃可能是由异常引起的。

于 2015-09-24T07:57:47.240 回答