http://blog.csdn.net/foshanzhuifeng/article/details/7191541
前几天无聊之际,在网上看到一篇关于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;
- }
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;
- }
void print()
{
cout<<"this : "<<this<<endl;
}
main函数都能运行得通,对于这种现象可以从汇编、内存的角度来解释。
我们单步运行调试分析:
第一步:
第二步:
这里进入new()函数来进一步分析:
接下来分析
- myClass->print();
- myClass[100000000].print();
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属于用户的,如果刚好那个地址超过
了空间界限,就会报错。
才学浅陋,望各位提出批评建议