【问题标题】:Why a function call on a NULL pointer is working in C++? [duplicate]为什么对 NULL 指针的函数调用在 C++ 中有效? [复制]
【发布时间】:2014-10-19 18:16:00
【问题描述】:

我尝试了这个简单的代码,但得到了一个奇怪的结果:

#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 编译,带有这些参数:g++ -O0 Test.cpp -o Test

当我运行程序时,我得到这个结果:

$ ./Test 
CTest::Function()

这怎么可能?

【问题讨论】:

    标签: c++


    【解决方案1】:

    取消引用空指针是undefined behavior,未定义的行为是偷偷摸摸的,因为有时它可能似乎有效。

    在您的特定情况下,它很可能会起作用,因为它是纯成员函数调用,并且成员函数不会对对象的内部状态做任何事情。如果你添加一个成员变量并尝试在成员函数中访问它,那可能会导致崩溃。

    【讨论】:

    • 如果我只是删除对象然后使用它,您的回答是合理的。但是我将指针设置为 NULL: 0x00000000 (通过打印出来进行测试)。编译器如何取消引用它?
    • @Lorenzo,查看副本。
    • 好的,我明白了。编译器仅使用对象实例的地址来访问成员变量(指针地址+成员变量偏移量),但通过调用成员函数,它不使用指针地址,而是使用代码内存段中类的基地址。而且我也明白这是一种未定义的行为,不同的编译器可能会使用不同的策略。
    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2019-04-02
    • 2023-03-27
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多