我尝试访问win32应用程序中的空指针值,但没有发生访问冲突
I try to access the value of a null pointer in win32 application, but no access violation occurs
我编写的示例代码应该会导致访问冲突,但事实并非如此。我认为return *m_pObj
的GetSession1()
、GetSession2()
函数中应该出现异常,但事实并非如此。为什么?
头文件
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;
};
取消引用空指针是未定义的行为(这里有一个更"严重"的链接:为什么取消引用空指示器是未定义行为?)。你的程序可能会崩溃,或者随心所欲。C++标准没有强制要求存在"访问冲突"。
未定义行为(UB)是坏的,你不能总是依赖编译器来捕捉它。例如,下面的代码清楚地说明了UB坏的原因:
#include <iostream>
int main()
{
int *p = nullptr;
int q = *p;
//std::cout << q;
}
在我的机器上,我没有得到任何警告,代码编译和运行都很好。如果我取消对std::cout
行的注释,BANG,它就会崩溃。这可能是因为编译器优化了空指针的去引用,但在尝试使用q
时无法优化它。这可能是你的代码中发生的事情,但同样,这是UB,程序运行的事实不应该给你任何保证。
您编写的构造函数不执行任何操作,因此当位于NULL地址时,实际上并没有尝试访问m_lUSN
,因此不会获得任何AV。如果您更改CSession()
复制构造函数以将rhs.m_lUSN
的值复制到this->m_lUSN
,或者添加公共getter/setter方法以使_tmain()
可以读取/设置m_lUSN
的值,您将开始看到GetSesstion(1|2)()
返回的对象中出现AV。
相关文章:
- C++尝试深度复制唯一指针时出现内存访问冲突
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- 尝试通过共享指针使用变量时读取访问冲突
- 使用智能指针读取访问冲突
- C 指针转换会导致内存访问冲突
- C++:读取 Lambda 捕获的指针时出现访问冲突
- 初始化指针时出现写入访问冲突
- 不能对基于数组的指针使用数组运算符(读取访问冲突)
- C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD
- 调用指针时违反 C++ Typedef 访问冲突
- 为什么未初始化的指针会导致接近 0 的 mem 访问冲突
- 视觉C++ Battle4锡安项目 引发未处理的异常:读取访问冲突.**这**是空的.发生
- 执行指针时发生C++访问冲突
- 空指针可访问
- 数组访问导致空指针取消引用
- C++多态性中的访问冲突(虚拟指针函数指向错误的位置?
- 我尝试访问win32应用程序中的空指针值,但没有发生访问冲突
- 访问非空指针时出现段故障
- c++断言中的未定义行为:访问无效/空指针