• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            C++構造函數與析構函數


            //a.h代碼:
            #pragma once
            #include 
            <iostream>
            using namespace std;
            void test();

            #include "a.h"
            //a.cpp代碼:
            class MyTest
            {
            public:
                MyTest(){
                    cout 
            << "MyTest()" << endl;
                }
                
            ~MyTest(){
                    cout 
            << "~MyTest()" << endl;
                }
            };
            void test()
            {
                MyTest test;
            }

            //main.cpp
            #include <iostream>
            #include 
            "a.h"
            int main() 
            {
                test();
                
            int a=5;
                
            int b=6;
                
            return 0;
            }

            int main()
            {
            004114C0  push        ebp  
            004114C1  mov         ebp,esp
            004114C3  sub         esp,0D8h
            004114C9  push        ebx  
            004114CA  push        esi  
            004114CB  push        edi  
            004114CC  lea         edi,[ebp-0D8h]
            004114D2  mov         ecx,36h
            004114D7  mov         eax,0CCCCCCCCh
            004114DC  rep stos    dword ptr es:[edi]
                callmyfunc();
            004114DE  call        callmyfunc (41125Dh)
                int a=5;
            004114E3  mov         dword ptr [a],5
                int b=6;
            004114EA  mov         dword ptr [b],6
                return 0;
            004114F1  xor         eax,eax
            }

            0041125D  jmp         callmyfunc (411520h)

            void callmyfunc()
            {
            00411520  push        ebp  
            00411521  mov         ebp,esp
            00411523  sub         esp,0CCh
            00411529  push        ebx  
            0041152A  push        esi  
            0041152B  push        edi  
            0041152C  lea         edi,[ebp-0CCh]
            00411532  mov         ecx,33h
            00411537  mov         eax,0CCCCCCCCh
            0041153C  rep stos    dword ptr es:[edi]
                MyTest mytestclass;
            0041153E  lea         ecx,[mytestclass]
            00411541  call        MyTest::MyTest (4111C7h)
            }
            00411546  lea         ecx,[mytestclass]
            00411549  call        MyTest::~MyTest (41102Dh)
            0041154E  push        edx  
            0041154F  mov         ecx,ebp
            00411551  push        eax  
            00411552  lea         edx,[ (411574h)]
            00411558  call        @ILT+170(@_RTC_CheckStackVars@8) (4110AFh)
            0041155D  pop         eax  
            0041155E  pop         edx  
            0041155F  pop         edi  
            00411560  pop         esi  
            00411561  pop         ebx  
            00411562  add         esp,0CCh
            00411568  cmp         ebp,esp
            0041156A  call        @ILT+415(__RTC_CheckEsp) (4111A4h)
            0041156F  mov         esp,ebp
            00411571  pop         ebp  
            00411572  ret




            call 指令
            CPU執行call指令,進行兩步操作:
            1)將當前的 IP 或 CS和IP 壓入棧中;
            2)轉移。

            call 指令在實現轉移之前, 要將返回地址存入堆棧的, 以便子程可以通過 ret 指令返回到 CALL 指令下面的指令接著運行;
            jmp 就沒用這些事兒, 直接過去就過去了, 以后的執行流程全由那里的說了算. 當然了, 一些特殊的執行流程控制技巧除外.




            大概的意思,匯編我也不怎么懂.
            004114DE  call        callmyfunc (41125Dh)
            0041125D  jmp         callmyfunc (411520h)
            然后直接jmp 到callmyfunc函數的地址.
            callmyfunc函數結束的后面,加入了調用析構的代碼如下:
            00411546  lea         ecx,[mytestclass]
            00411549  call        MyTest::~MyTest (41102Dh)

            現在大概知道C++析構的原理了,編譯器對調用函數做了個子過程包裝,
            然后加入析構調用代碼.最后返回.

            這樣看來,如果函數中產生異常,可能會導致析構函數不能正確的調用,從而導致內存泄漏.

            根據分析,繼續測試.







            C++標準規定,本地對象的析構函數的調用順序與他們的構造順序相反。
            C++標準規定,本地對象的析構函數的調用順序與他們的構造順序相反。
            C++標準規定,本地對象的析構函數的調用順序與他們的構造順序相反。
            C++標準規定,本地對象的析構函數的調用順序與他們的構造順序相反。
            //C++標準規定,本地對象的析構函數的調用順序與他們的構造順序相反。

            void callMyTest()
            {
                MyTestA MyTestAObj;
                MyTestB MyTestBObj;
            }

            int main() 
            {
            004121B0  push        ebp  
            004121B1  mov         ebp,esp 
            004121B3  sub         esp,0D8h 
            004121B9  push        ebx  
            004121BA  push        esi  
            004121BB  push        edi  
            004121BC  lea         edi,[ebp
            -0D8h] 
            004121C2  mov         ecx,36h 
            004121C7  mov         eax,0CCCCCCCCh 
            004121CC  rep stos    dword ptr es:[edi] 
                callMyTest();
            004121CE  call        callMyTest (411159h) 
                
            int a=5;
            004121D3  mov         dword ptr [a],
            5 
                
            int b=6;
            004121DA  mov         dword ptr [b],
            6 
                
            return 0;
            004121E1  xor         eax,eax 
            }

            00411159  jmp         callMyTest (411540h) 



            void callMyTest()
            {
            00411540  push        ebp  
            00411541  mov         ebp,esp 
            00411543  push        0FFFFFFFFh 
            00411545  push        offset __ehhandler$?callMyTest@@YAXXZ (4155E8h) 
            0041154A  mov         eax,dword ptr fs:[00000000h] 
            00411550  push        eax  
            00411551  sub         esp,0D8h 
            00411557  push        ebx  
            00411558  push        esi  
            00411559  push        edi  
            0041155A  lea         edi,[ebp
            -0E4h] 
            00411560  mov         ecx,36h 
            00411565  mov         eax,0CCCCCCCCh 
            0041156A  rep stos    dword ptr es:[edi] 
            0041156C  mov         eax,dword ptr [___security_cookie (41B044h)] 
            00411571  xor         eax,ebp 
            00411573  push        eax  
            00411574  lea         eax,[ebp-0Ch] 
            00411577  mov         dword ptr fs:[00000000h],eax 
                MyTestA MyTestAObj;
            0041157D  lea         ecx,[ebp
            -11h] 
            00411580  call        MyTestA::MyTestA (4110FAh) 
            00411585  mov         dword ptr [ebp-4],0 
                MyTestB MyTestBObj;
            0041158C  lea         ecx,[ebp
            -1Dh] 
            0041158F  call        MyTestB::MyTestB (41103Ch) 
            }
            00411594  lea         ecx,[ebp-1Dh] 
            00411597  call        MyTestB::~MyTestB (41114Fh) 
            0041159C  mov         dword ptr [ebp
            -4],0FFFFFFFFh 
            004115A3  lea         ecx,[ebp
            -11h] 
            004115A6  call        MyTestA::
            ~MyTestA (411226h) 
            004115AB  push        edx  
            004115AC  mov         ecx,ebp 
            004115AE  push        eax  
            004115AF  lea         edx,[ (4115DCh)] 
            004115B5  call        @ILT
            +185(@_RTC_CheckStackVars@8) (4110BEh) 
            004115BA  pop         eax  
            004115BB  pop         edx  
            004115BC  mov         ecx,dword ptr [ebp
            -0Ch] 
            004115BF  mov         dword ptr fs:[
            0],ecx 
            004115C6  pop         ecx  
            004115C7  pop         edi  
            004115C8  pop         esi  
            004115C9  pop         ebx  
            004115CA  add         esp,0E4h 
            004115D0  cmp         ebp,esp 
            004115D2  call        @ILT
            +465(__RTC_CheckEsp) (4111D6h) 
            004115D7  mov         esp,ebp 
            004115D9  pop         ebp  
            004115DA  ret  






            posted on 2011-10-22 10:29 天下 閱讀(1680) 評論(0)  編輯 收藏 引用 所屬分類: C/C++Win32

            <2011年10月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            国产成人精品久久亚洲| 99久久国产热无码精品免费| 青青草原综合久久大伊人导航| 青春久久| 丁香五月网久久综合| 久久乐国产精品亚洲综合| 久久久久99这里有精品10| 久久99精品久久久久子伦| 久久久久国色AV免费观看| 亚洲国产成人精品91久久久| 精品熟女少妇av免费久久| 久久久噜噜噜久久中文字幕色伊伊| 99精品国产99久久久久久97| 久久精品?ⅴ无码中文字幕| 无码国内精品久久人妻| 蜜桃麻豆www久久国产精品| 丰满少妇人妻久久久久久| 久久亚洲日韩看片无码| 成人a毛片久久免费播放| 精品无码久久久久国产| 亚洲午夜久久久久久噜噜噜| 成人综合久久精品色婷婷| 国产精品丝袜久久久久久不卡| 国产V综合V亚洲欧美久久| 亚洲国产精品久久电影欧美| 欧美一区二区久久精品| 久久天天躁狠狠躁夜夜2020| 91久久精品视频| 亚洲综合婷婷久久| 久久最新精品国产| 久久99国产精品99久久| 久久久中文字幕| 久久综合狠狠综合久久激情 | 69SEX久久精品国产麻豆| 久久国产精品无码HDAV| 青草国产精品久久久久久| 亚洲精品国精品久久99热一| 亚洲AV日韩精品久久久久| 色婷婷综合久久久久中文| 久久久久高潮毛片免费全部播放| 亚洲精品无码久久久久sm|