当前位置:  开发笔记 > 编程语言 > 正文

我尝试在win32应用程序中访问空指针的值,但不会发生访问冲突

如何解决《我尝试在win32应用程序中访问空指针的值,但不会发生访问冲突》经验,为你挑选了1个好方法。

我编写了应该导致访问冲突的示例代码,但事实并非如此.我认为异常应该发生在GetSession1(),GetSession2()函数for return *m_pObj,但它没有.这是为什么?

头文件

class CSession
{
    public:
        CSession() {};
        ~CSession() {};
        CSession(const CSession& rhs) {};
    private:
        long m_lUSN;
};

class CTest
{
    public:
        CSession* m_pObj;
        CSession& GetSesstion1() { m_pObj = NULL; return *m_pObj; }
        CSession GetSesstion2(); { m_pObj = NULL; return *m_pObj; }
};

Cpp文件

int _tmain(int argc, _TCHAR* argv[])
{
    CTest test;
    CSession Session2 = test.GetSesstion1();
    CSession Session3 = test.GetSesstion2();
    return 0;
};

vsoftco.. 6

取消引用空指针是未定义的行为(这里更"严重"的链接:为什么解除引用空指针是未定义的行为?).您的程序可能崩溃,或者可能做任何想做的事情.C++标准并未强制要求"访问冲突".

未定义的行为(UB)很糟糕,您不能依赖编译器来始终捕获它.例如,下面的代码清楚地表明为什么UB是坏的:

#include 

int main()
{
    int *p = nullptr;
    int  q = *p;
    //std::cout << q;
}

在我的机器上,我没有得到任何警告,代码编译并运行得很好.如果我取消评论该std::cout行,BANG,它会崩溃.这是因为编译器可能优化了空指针的解除引用,但是在尝试使用时无法对其进行优化q.这就是你的代码中可能发生的事情,但同样,它是UB,程序运行的事实不应该给你任何保证.



1> vsoftco..:

取消引用空指针是未定义的行为(这里更"严重"的链接:为什么解除引用空指针是未定义的行为?).您的程序可能崩溃,或者可能做任何想做的事情.C++标准并未强制要求"访问冲突".

未定义的行为(UB)很糟糕,您不能依赖编译器来始终捕获它.例如,下面的代码清楚地表明为什么UB是坏的:

#include 

int main()
{
    int *p = nullptr;
    int  q = *p;
    //std::cout << q;
}

在我的机器上,我没有得到任何警告,代码编译并运行得很好.如果我取消评论该std::cout行,BANG,它会崩溃.这是因为编译器可能优化了空指针的解除引用,但是在尝试使用时无法对其进行优化q.这就是你的代码中可能发生的事情,但同样,它是UB,程序运行的事实不应该给你任何保证.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有