将指针设置为null

时间:2016-03-03 09:49:43

标签: c++

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

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

输出

Inside doSomething
在doSomething内部

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

2 个答案:

答案 0 :(得分:9)

这是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

答案 1 :(得分: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;
}