我尝试了这个简单的代码,但我得到了一个奇怪的结果:
#include <iostream>
class CTest
{
public:
void Function() { std::cout << "CTest::Function()" << std::endl; }
};
int main()
{
CTest *pTest = new CTest;
delete pTest;
pTest = NULL;
pTest->Function();
}
使用以下参数与GCC进行编译:{{1}}
当我运行程序时,我得到了这个结果:
g++ -O0 Test.cpp -o Test
这怎么可能?
答案 0 :(得分:4)
取消引用空指针是undefined behavior,并且未定义的行为是偷偷摸摸的,有时它可能似乎有效。
在您的特定情况下,它很可能是有效的,因为它是纯成员函数调用,并且成员函数不对对象内部状态做任何事情。如果添加成员变量并尝试在成员函数中访问它,则可能会导致崩溃。