我不明白下面的代码如何产生给定的输出。
#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()。里面究竟发生了什么?
答案 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;
}