空指针操作在linux和windows下的区别

来源:互联网 发布:js数据类型转换 编辑:程序博客网 时间:2024/06/05 11:56

空指针的非法访问:
* 在windows下可以用try-catch捕获住.
* 在linux下, 无法用try-catch捕获住, 直接段错误, 程序崩溃了.
为了安全操作指针, 在使用指针前, 必须对指针进行非空检查。

实验

    for (int i = 0; i < 10; i++) {        printf("testcase_try_catch : i = %d\n", i);        testcase_try_catch(argc, argv);    }
int testcase_try_catch(int argc, char* argv[]){    char* pBuf = new char[0x100];    try {        if (NULL != pBuf) {            memset(pBuf, 0, 0x100);            strcpy(pBuf, "xello");            if (0 == (rand() % 2)) {                delete []pBuf;                pBuf = NULL;            }            // 如果不在使用指针前, 检查指针是否为空            // 当指针为空时进行赋值的后果            // windows : 会被try-catch捕获住            // linux : try-catch无法捕获, 直接段错误, 程序崩掉了            // 总结 : 为了安全的使用指针,在使用指针前,都要进行指针的有效性检查            // 不能依赖try-catch来预防指针为空的非法访问            // try-catch捕获的是异常(设计出来的改变流程的手段)            // try-catch不可用来捕获非法访问(程序的错误)            // 为了程序的兼容性, 空指针的检查时必须的            // if (NULL != pBuf) {                *pBuf = 'h';                printf("%s\n", pBuf);            // }        }    }    catch (exception e) {        printf("catch (exception e) : %s\n", e.what());    }    catch (...) {        // catch... 在linux下也捕获不了空指针非法访问        printf("catch (...)\n");    }    if (NULL != pBuf) {        delete []pBuf;    }    return 0;}
run resulttestcase_try_catch : i = 0hellotestcase_try_catch : i = 1./Makefile: line 42:  4081 Segmentation fault      ./testcaseroot@debian:/home/dev/testdir# 
0 0
原创粉丝点击