【问题标题】:Accessing a function through a pointer after setting the pointer to null [duplicate]将指针设置为空后通过指针访问函数[重复]
【发布时间】:2016-06-16 13:35:45
【问题描述】:

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

#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();
}

输出


在doSomething里面
里面做某事

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

【问题讨论】:

    标签: c++


    【解决方案1】:

    这是Undefined Behaviour,绝对有可能发生任何事情,包括看起来工作。 这不可靠!!

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

    如果您给了MyClass 一个成员,并尝试在doSomething() 中访问该成员,我希望看到crash (segfault)

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

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


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

    【讨论】:

      【解决方案2】:

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

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

      所以,每个函数都有一个隐藏的this指针,所以删除对象后这个指针是无效的。所以任何对这个指针的访问都会在对象被删除后崩溃。

      这是内部发生的事情的简化版本:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-06
        • 2015-04-26
        • 2015-12-17
        • 2019-09-22
        • 2014-04-10
        • 2017-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多