我编写了应该导致访问冲突的示例代码,但事实并非如此.我认为异常应该发生在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是坏的:
#includeint main() { int *p = nullptr; int q = *p; //std::cout << q; }
在我的机器上,我没有得到任何警告,代码编译并运行得很好.如果我取消评论该std::cout
行,BANG,它会崩溃.这是因为编译器可能优化了空指针的解除引用,但是在尝试使用时无法对其进行优化q
.这就是你的代码中可能发生的事情,但同样,它是UB,程序运行的事实不应该给你任何保证.
取消引用空指针是未定义的行为(这里更"严重"的链接:为什么解除引用空指针是未定义的行为?).您的程序可能崩溃,或者可能做任何想做的事情.C++标准并未强制要求"访问冲突".
未定义的行为(UB)很糟糕,您不能依赖编译器来始终捕获它.例如,下面的代码清楚地表明为什么UB是坏的:
#includeint main() { int *p = nullptr; int q = *p; //std::cout << q; }
在我的机器上,我没有得到任何警告,代码编译并运行得很好.如果我取消评论该std::cout
行,BANG,它会崩溃.这是因为编译器可能优化了空指针的解除引用,但是在尝试使用时无法对其进行优化q
.这就是你的代码中可能发生的事情,但同样,它是UB,程序运行的事实不应该给你任何保证.