我不明白下面的代码如何产生给定的输出。
#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
内部doSomething
我用空指针执行了一个函数,它实际上调用了该函数。使用ptr的cout检索存储在ptr中的地址表明,在语句ptr = NULL之后,将ptr设置为0。但是它仍然调用doSomething()。里面到底发生了什么?
这是未定义的行为,并且绝对可能发生任何事情,包括看起来可行。这不可靠!!
在这种情况下,它不会崩溃,仅仅是因为该MyClass::doSomething()
函数对其this
指针没有执行任何操作(这可能是NULL
,因此很可能导致崩溃)。
如果您给了MyClass
一个成员,并尝试在中访问该成员,那么doSomething()
我希望看到崩溃(segfault):
class MyClass
{
int someNum;
public:
void doSomething()
{
cout<< "Inside doSomething: " << this->someNum <<endl;
}
};
(在Linux上对gcc 4.9.2的测试中,我确实确实看到了段错误。)
另外,请重新考虑您对不良做法using namespace std;
和的使用endl
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句