• 热门专题

从汇编、内存的角度看类中的this指针

作者:foshanzhuifeng  发布日期:2012-01-10 20:45:22
Tag标签:this指针  
  • 前几天无聊之际,在网上看到一篇关于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属于用户的,如果刚好那个地址超过

    了空间界限,就会报错。

    才学浅陋,望各位提出批评建议!


     


     


延伸阅读:

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规