将指针设置为 null 后通过指针访问函数

Accessing a function through a pointer after setting the pointer to null

本文关键字:指针 访问 函数 null 设置      更新时间:2023-10-16

我不明白下面的代码段如何产生给定的输出。

#include <iostream>
using namespace std;
class MyClass
{
   public: 
   void doSomething()
   { 
       cout<<"Inside doSomething"<<endl;  
   }
};
int main()
{   
    MyClass obj;
    MyClass *ptr=&obj;
    ptr->doSomething();
    ptr=NULL;
    ptr->doSomething();
}

输出


内幕做某事
内幕做某事

我执行了一个带有空指针的函数,它实际上调用了该函数。使用 ptr 的 cout 检索存储在 ptr 中的地址显示,在语句 ptr=NULL; 之后,ptr 设置为 0。但它仍然调用doSomething()。里面到底发生了什么?

这是未定义的行为,绝对可能发生任何事情,包括看起来有效。这不可靠!!

在这种情况下,它不会崩溃,仅仅是因为 MyClass::doSomething() 函数没有对其this指针执行任何操作(这将是NULL,因此可能会导致崩溃)。

如果您给了MyClass一个成员,并尝试在doSomething()中访问它,我希望看到崩溃(段错误):

class MyClass
{
   int someNum;
   public: 
   void doSomething()
   { 
       cout<< "Inside doSomething: " << this->someNum <<endl;  
   }
};

(在我在 Linux 上使用 gcc 4.9.2. 的测试中,我确实看到了段错误。


另外,请重新考虑您使用不良做法using namespace std;endl

原因是您只访问始终存在的类的代码段。

但是,当您尝试从函数内部访问任何成员变量时,您很可能会崩溃。

所以,

每个函数都有一个隐藏的这个指针传递,所以删除对象后这个指针是无效的。因此,删除对象后,对此指针的任何访问都将崩溃。

以下是内部正在发生的事情的简化版本:

doSomething(MyClass * this)
{
  // Will work OK if 'this' pointer is NULL, but NOT used.
  // Will Crash if 'this' pointer is used.
  this->data = 100;
}