我的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;
}

07-26 00:04
查看更多