我的x64应用程序是用/ EHa编译的,
我想保护我的代码以防访问冲突,但是无论我的SEH和终止处理程序如何,应用程序进程似乎都崩溃了。
void my_se_translator(unsigned int, struct _EXCEPTION_POINTERS*) {
cout << "se_translator_called" << endl;
}
void my_terminate_handler() {
cout << "my_terminate_handler_called" << endl;
}
#pragma optimize("", off)
void test() {
int* k = nullptr;
int z = *k;
}
#pragma optimize("", on)
int main(int argc, char* argv[]) {
_set_se_translator(my_se_translator);
set_terminate(my_terminate_handler);
test();
return 0;
}
对于在这种情况下_set_se_translator为什么不起作用的很好的解释,将不胜感激?
最佳答案
从MSDN website:
您的翻译器功能只不过是抛出一个C ++类型
例外。如果除了投掷之外还执行其他操作(例如
例如,写入日志文件)您的程序可能无法像
预期的,因为翻译器功能的次数是
调用取决于平台。
当您添加一个简单的异常类时:
class myException{
};
然后将异常抛出到my_se_translator函数中,并在您的示例应该起作用的主函数或测试函数中捕获该异常。
void my_se_translator(unsigned int, struct _EXCEPTION_POINTERS*) {
std::cout << "se_translator_called" << std::endl;
throw myException();
}
int main(int argc, char* argv[]) {
_set_se_translator(my_se_translator);
set_terminate(my_terminate_handler);
try{
test();
}
catch(myException e) {
std::cout << "EXCEPTION!" << std::endl;
}
return 0;
}