我的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在这种情况下无法正常工作,会有一个很好的解释吗?
答案 0 :(得分:1)
来自MSDN website:
你的翻译函数不应该只是输入一个C ++类型 例外。如果它除了投掷之外还做任何事情(例如 例如,写入日志文件)您的程序可能不会表现为 预期,因为翻译功能的次数 调用是依赖于平台的。
添加简单的异常类时:
class myException{
};
然后在my_se_translator函数中抛出异常,并在main示例或test函数中捕获异常,例如:
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;
}