64,662
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<cstring>
using namespace std;
class A
{
public:
void prinfs()
{
cout<<"aaaaa"<<endl;
}
};
int main( )
{
A *a;
a->prinfs();
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
class A
{
public:
void prinfs()
{
cout<<"aaaaa"<<endl;
}
};
int main( )
{
A *a;
a->prinfs();
return 0;
}
其中调用a->printfs();其实是对该类中方法的直接调用,而你没有直接使用到this指针因此系统不报错。
我有以下佐证(windows下验证):
A *a;
a->prinfs();
004114E5 cmp byte ptr [ebp-0D1h],0
004114EC jne wmain+3Bh (4114FBh)
004114EE push offset (411519h)
004114F3 call @ILT+250(__RTC_UninitUse) (4110FFh)
004114F8 add esp,4
004114FB mov ecx,dword ptr [a]
004114FE call Printer::Printer (411267h)
以上是执行a->printfs();的汇编代码,当然在这段代码中是会出错的,由于没有进行初始化因此编译器执行__RTC_UninitUse来进行检查,所以代码执行到这就会发生异常,但继续执行还是可以输出‘aaaaa’。
我后来给指针赋值为NULL汇编代码如下
A *a= NULL;
004114DE mov dword ptr [a],0
a->prinfs();
004114E5 mov ecx,dword ptr [a]
004114E8 call Printer::Printer (411267h)
执行过程没有发生异常,可以看到寄存器ecx中保存的即时对象指针。
因此你要的答案是:
是野指针。因为调用对象的方法是直接调用类中函数的方法来实现的,在这个例子中是可以使用的。
提示:
如果你在该方法中使用了类中的其他成员变量,则会造成不可预期的错误。建议修改此类错误。