C++ 为什么未处理的异常会导致分段错误?

C++ 为什么未处理的异常会导致分段错误?,c++,exception,segmentation-fault,C++,Exception,Segmentation Fault,下面是一个最起码的例子: [joel@maison various] (master *)$ cat throw.cpp #include <iostream> int main(int argc, char* argv[]) { throw("pouet pouet"); } [joel@maison various] (master *)$ ./a.out terminate called after throwing an instance of 'char c

下面是一个最起码的例子:

[joel@maison various] (master *)$ cat throw.cpp 

#include <iostream>


int main(int argc, char* argv[])
{
  throw("pouet pouet");
}

[joel@maison various] (master *)$ ./a.out 
terminate called after throwing an instance of 'char const*'
Aborted (core dumped)

读取文档时,默认的终止处理程序似乎是abort。我在abort手册页中找不到任何关于触发segfault的信息。

引发异常,而不处理异常则调用abort,从而引发SIGABRT

您可以使用以下方法进行验证

#include <iostream>
#include <stdexcept>
#include <signal.h>

extern "C" void handle_sigabrt(int)
{
    std::cout << "Handling and then returning (exiting)" << std::endl;
}

int main()
{
  signal(SIGABRT, &handle_sigabrt);

  throw("pouet pouet");
}

抛出异常而不处理它会调用abort,从而引发SIGABRT

您可以使用以下方法进行验证

#include <iostream>
#include <stdexcept>
#include <signal.h>

extern "C" void handle_sigabrt(int)
{
    std::cout << "Handling and then returning (exiting)" << std::endl;
}

int main()
{
  signal(SIGABRT, &handle_sigabrt);

  throw("pouet pouet");
}

这不是一个错误。那是流产。是什么让你认为这是一个断层?@FrédéricHamidi:接得好!我被核心转储信息误导了。这不是一个错误。那是流产。是什么让你认为这是一个断层?@FrédéricHamidi:接得好!我被核心信息误导了,这就是Sigabtnice的例子。在live demo中,为什么它会在处理之前打印以char const*类型的未捕获异常终止,然后返回退出?@Muscampester,当它检测到未捕获异常时,第一条消息来自实现。它打印消息,然后调用abort。即使使用std::endl强制stdout刷新,该消息也是特定于实现的。程序将在处理程序返回后立即终止。一种非常骇人的方式,因此非常不鼓励避免这种情况的发生,这种方式不会再出现了。另一种方法可以是使用boost::coroutine2中的堆栈蹦床。如果要在生产软件中部署这些技术,至少需要非常小心。很好的例子。在live demo中,为什么它会在处理之前打印以char const*类型的未捕获异常终止,然后返回退出?@Muscampester,当它检测到未捕获异常时,第一条消息来自实现。它打印消息,然后调用abort。即使使用std::endl强制stdout刷新,该消息也是特定于实现的。程序将在处理程序返回后立即终止。一种非常骇人的方式,因此非常不鼓励避免这种情况的发生,这种方式不会再出现了。另一种方法可以是使用boost::coroutine2中的堆栈蹦床。如果要在生产软件中部署这些技术,至少需要非常谨慎。