如何捕获空指针异常?

min*_*cks 41 c++ exception-handling try-catch

  try {
        int* p = 0;
        *p = 1;
    } catch (...) {
        cout << "null pointer." << endl;
    }
Run Code Online (Sandbox Code Playgroud)

我试图抓住这样的例外,但它没有用,有什么帮助吗?

AnT*_*AnT 58

在C++中没有"空指针异常"这样的东西.你可以捕捉唯一的例外,是明确地抛出的异常throw表达(加,如帕维尔注意到,一些标准的C++异常本质上通过标准抛出operator new,dynamic_cast等).C++中没有其他例外.取消引用空指针,除以零等不会在C++中生成异常,它会产生未定义的行为.如果您希望在这样的情况下抛出异常,那么您自己有责任手动检测这些条件并throw明确地执行.这就是它在C++中的工作方式.

你似乎在寻找的其他东西都与C++语言有关,而是特定实现的一个特性.例如,在Visual C++中,系统/硬件异常可以"转换"为C++异常,但这种非标准功能需要附加价格,这通常不值得付费.


GMa*_*ckG 25

你不能.取消引用空指针是一个系统问题.

在Linux上,操作系统会在您的应用程序中引发信号.看看csignal,了解如何处理信号.为了"捕获"一个,你将挂钩一个函数,在这种情况下将被调用SIGSEGV.在优雅地终止程序之前,您可以尝试打印一些信息.

Windows使用结构化异常处理.您可以使用instristics __try/__except,如上一个链接中所述.我在我编写的某个调试实用程序中使用该函数的方式_set_se_translator(因为它与钩子紧密匹配).在Visual Studio中,确保已启用SEH.使用该函数,您可以挂钩函数以在系统在应用程序中引发异常时调用; 在你的情况下,它将调用它EXCEPTION_ACCESS_VIOLATION.然后,您可以抛出异常并将其传播回去,就像首先抛出异常一样.

  • 嘿,我说:P (3认同)
  • @Joseph:虽然 boost 通常与平台无关,但如果这样做有意义的话,它确实倾向于在内部使用特定于平台的代码。在这种情况下,它为非 Windows 平台创建 _set_se_translator 的空实现(请参阅 boost-1.37.0/include/boost/test/impl/execution_monitor.ipp)。这对于 boost.test 非常有效,它可以帮助在可用的 Windows 平台上进行调试,并在其他平台上正常工作。 (2认同)

Pav*_*aev 9

取消引用null(或指向数组末尾的指针或随机无效指针)会导致未定义的行为.没有可移植的方法来"捕获"它.


Vol*_*kyy 7

有一种非常简单的方法可以使用- > 块在Visual Studio中捕获任何类型的异常(除零,访问冲突等).trycatch (...)

一个小项目调整就足够了.只需/EHa在项目设置中启用该选项即可.请参阅项目属性 - > C/C++ - >代码生成 - >将启用C++例外修改为"是和SEH例外".而已!

详情请见:http: //msdn.microsoft.com/en-us/library/1deeycx5(v = vs.)


Nat*_*C-K 5

C++不做指针检查(虽然我认为有些实现可以).如果你试图写入空指针,它很可能会崩溃.它不会抛出异常.如果你想要捕获它,你需要在尝试写入之前自己检查指针的值.

  • 这实际上取决于实施和操作系统.例如,在Win32上,取消引用空指针将导致访问冲突(实际上是任何其他具有内存保护的平台),但Win32 AV是一个结构化异常,它可以被C++编译器捕获,该编译器实现了自己的异常模型Win32 SEH的顶部 - 例如,VC++带有`/ EHa`编译标志.当然,它仍然是纯粹的邪恶(并且不可移植). (5认同)
  • 说到内存保护,我开始在DOS上编写C语言,当写入空指针通常意味着你要重启你的机器.至少DOS启动得相当快. (3认同)