解引用指向类成员函数的NULL指针

Dereferncing NULL pointer to member function of class

本文关键字:函数 NULL 指针 成员 引用      更新时间:2023-10-16

我很好奇这个程序是如何打印类的func()语句的

#include <iostream>
using namespace std;
class foo
{
    public:
        void func ()
        {
            cout << "In func" << endl;
        }
    private:
        int a;
};
int main () {
    foo *f1 = NULL;
    f1->func();
}

编译器版本:g++ (Ubuntu/Linaro 4.4.7-1ubuntu2版权所有自由软件基金会,Inc.

我是如何能够得到方法func()的打印?

对空指针解引用会产生未定义行为。

我可以猜到为什么这仍然适用于你(但再次它是UB!),但如果你试图访问func()中的成员变量,我很确定它会停止工作。

解除对NULL指针的引用意味着您有未定义的行为。

然而,在这种情况下,在大多数实现中,您将最终在正确的函数中使用thisNULL,调用非虚方法的正常实现是将隐藏参数this设置为指向对象的指针(在这种情况下为NULL),然后只是调用函数。如果你不访问成员变量或调用虚方法,你应该在大多数实现中很好。

由于您不能访问成员或调用虚函数或以任何其他方式使用this指针做任何有用的事情,因此您非常接近static方法的场景,如果不使用this指针,我建议使用它。

如果你只想用this指针检查NULL是否正确,那么你仍然可以使用static方法并显式地将指针传递给对象:

  static void func(foo* diz) {
       cout << "In func" << endl;
       if( diz != NULL ) {
           diz->actual_work_on_diz();
       }
  }