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

1 c++ null access-violation visual-studio-2013

我编写了应该导致访问冲突的示例代码,但事实并非如此.我认为异常应该发生在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; }
};
Run Code Online (Sandbox Code Playgroud)

Cpp文件

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

vso*_*tco 6

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

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

#include <iostream>

int main()
{
    int *p = nullptr;
    int  q = *p;
    //std::cout << q;
}
Run Code Online (Sandbox Code Playgroud)

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