前几天无聊之际,在网上看到一篇关于this指针问题的文章,介绍得有点不详细,遂写下一些关于我个人的见解。
问题大概如下:
class MYCLASS
{
int a;
public:
MYCLASS()
{
}
~MYCLASS()
{
}
public:
void print()
{
cout<<"this : "<<this<<endl;
cout<<"finish"<<a<<endl;
}
int qian(int a, int b)
{
return a + b;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MYCLASS *myClass = NULL;
myClass = new MYCLASS();
myClass->print();//正确
myClass[1].print();//错误,但运行成功
myClass[100000000].print();//错误且不能运行
return 0;
}
接着修改一下MYCLASS类中的print()函数如下:
void print()
{
cout<<"this : "<<this<<endl;
}
main函数都能运行得通,对于这种现象可以从汇编、内存的角度来解释。
我们单步运行调试分析:
第一步:

第二步:

这里进入new()函数来进一步分析:

接下来分析
myClass->print();
myClass[100000000].print();
我们进入汇编来分析
调用myClass->print()的时候

从汇编可以看出,无论是myClass[0]还是myClass[100000000],其都是调用print()首地址,
但肯定是有区别的,但区别不在这里,接下来我们进入print()函数
myClass->print():

myClass[100000000].print():

从上面两种图中可以看出cout<<"finish"<<a<<endl;的时候,需要调用当前类的对象this,然后输出它的this->a
.因为myClass分配空间的时候只分配了一个对象(4个字节),所以myClass[1]到myClass[....]都是越界的。但之
所以有些能够运行,是因为系统为每个进程分配了4G的虚拟内存空间,其中2G属于用户的,如果刚好那个地址超过
了空间界限,就会报错。
才学浅陋,望各位提出批评建议!