为什么在抛出我的析构函数时没有调用std::terminate



我正在尝试"参见";从析构函数抛出时对std::terminate((的调用,代码如下:

#include <stdexcept>
struct boom {
~boom() {
throw std::logic_error("something went wrong");
}
};
int main() {
boom();
}

使用g++编译并运行代码:

# ./a.out
terminate called after throwing an instance of 'std::logic_error'
what():  something went wrong
Aborted (core dumped)

到目前为止还不错,似乎如预期那样工作(调用terminate(((。但是,当试图在gdb中中断terminate时,函数不会被命中,回溯只显示中止:

(gdb) b std::terminate
Breakpoint 2 at 0x7f60a3772240 (2 locations)
(gdb) r
Starting program: a.out
terminate called after throwing an instance of 'std::logic_error'
what():  something went wrong
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007f2c241eb921 in __GI_abort () at abort.c:79
#2  0x00007f2c24628957 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007f2c2462eae6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007f2c2462db49 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007f2c2462e4b8 in __gxx_personality_v0 () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007f2c23c05573 in ?? () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#7  0x00007f2c23c05ad1 in _Unwind_RaiseException () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#8  0x00007f2c2462ed47 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x0000558cee09593a in boom::~boom() ()
#10 0x0000558cee0958dd in main ()
(gdb)

这种行为不知怎的让我感到困惑,是不是我遗漏了什么?

编辑:

使用clang++和std::terminate断点的相同测试被命中:

Breakpoint 1, 0x0000000000400750 in std::terminate()@plt ()
(gdb) bt
#0  0x0000000000400750 in std::terminate()@plt ()
#1  0x00000000004009bf in __clang_call_terminate ()
#2  0x000000000187eef0 in ?? ()
#3  0x00000000004009a4 in boom::~boom() ()
#4  0x00000000004008f1 in main ()
(gdb)

您正在运行好像规则。

只要副作用保持不变,C++编译器就允许根据自己的意愿重写整个程序。

什么样的副作用是非常明确的;某个函数被称为";不是其中的一部分。因此,如果编译器能够确定这是std::terminate()对程序产生的唯一副作用,那么它完全可以直接调用abort()

您可以在获取更多详细信息https://en.cppreference.com/w/cpp/language/as_if

相关内容

最新更新