gpt4 book ai didi

c++ - 使用 noexcept C++11 正确实现函数

转载 作者:行者123 更新时间:2023-11-30 01:46:42 25 4
gpt4 key购买 nike

那些函数是否正确实现了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 函数,它会崩溃,因为 snullprt

然而,这次崩溃与异常无关。假设是否正确?

最佳答案

在:

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++ 异常,并且不需要编译器/运行时来检测它。

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

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

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

However this crash is nothing to do with exceptions. Is the assumption correct?

没错,崩溃也不异常(exception)。但是,崩溃可能是由异常引起的。

关于c++ - 使用 noexcept C++11 正确实现函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32756127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com