假设我有一个C库,我正在使用Visual Studio在Windows上将其链接到C++程序中。这个C库是黑盒子。如果此库发生致命错误(例如取消引用空值),程序/操作系统将如何处理此运行时错误?我知道在C++中有空引用异常,因此你可以使用try/catch处理此类错误,但由于这是一个C库,它不会发出throw,对吧?所以会发生什么?程序将终止,但如果不是C++异常,那么是通过哪种手段呢?
terminate()
,如果您没有注册SIGSEGV处理程序,操作系统将会友好地为您执行。malloc()
可能会失败(如果找不到足够的空间),它会通过返回空指针来表示,但如果程序在未进行检查的情况下对malloc()
的结果进行了解引用,则该程序就有误。catch(...)
,你不能处理它吗? - void.pointercatch
关键字捕获“异步”或“结构化”异常(例如无效内存访问)是MSVC对C++语言的扩展。只要使用正确的编译器选项/EHa
,即使这些异常来自C函数,也可以捕获这些异常:http://msdn.microsoft.com/en-us/library/1deeycx5%28v=VS.100%29.aspx
你还可以选择使用Microsoft的“结构化异常”处理语言扩展(也适用于C),该扩展使用__try
和__except
关键字:http://msdn.microsoft.com/en-us/library/swezty51.aspx