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)
取消引用空指针是未定义的行为(这里更"严重"的链接:为什么解除引用空指针是未定义的行为?).您的程序可能崩溃,或者可能做任何想做的事情.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,程序运行的事实不应该给你任何保证.