• <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++構(gòu)造函數(shù)與析構(gòu)函數(shù)


            //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執(zhí)行call指令,進(jìn)行兩步操作:
            1)將當(dāng)前的 IP 或 CS和IP 壓入棧中;
            2)轉(zhuǎn)移。

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




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

            現(xiàn)在大概知道C++析構(gòu)的原理了,編譯器對調(diào)用函數(shù)做了個子過程包裝,
            然后加入析構(gòu)調(diào)用代碼.最后返回.

            這樣看來,如果函數(shù)中產(chǎn)生異常,可能會導(dǎo)致析構(gòu)函數(shù)不能正確的調(diào)用,從而導(dǎo)致內(nèi)存泄漏.

            根據(jù)分析,繼續(xù)測試.







            C++標(biāo)準(zhǔn)規(guī)定,本地對象的析構(gòu)函數(shù)的調(diào)用順序與他們的構(gòu)造順序相反。
            C++標(biāo)準(zhǔn)規(guī)定,本地對象的析構(gòu)函數(shù)的調(diào)用順序與他們的構(gòu)造順序相反。
            C++標(biāo)準(zhǔn)規(guī)定,本地對象的析構(gòu)函數(shù)的調(diào)用順序與他們的構(gòu)造順序相反。
            C++標(biāo)準(zhǔn)規(guī)定,本地對象的析構(gòu)函數(shù)的調(diào)用順序與他們的構(gòu)造順序相反。
            //C++標(biāo)準(zhǔn)規(guī)定,本地對象的析構(gòu)函數(shù)的調(diào)用順序與他們的構(gòu)造順序相反。

            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 天下 閱讀(1684) 評論(0)  編輯 收藏 引用 所屬分類: C/C++Win32

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

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            欧美丰满熟妇BBB久久久| 亚洲色大成网站WWW久久九九| 婷婷久久综合九色综合98| 久久精品无码专区免费| 亚洲Av无码国产情品久久| 亚洲国产精品久久久天堂| 久久亚洲国产成人精品性色| 九九久久精品国产| 亚洲中文精品久久久久久不卡| 久久免费精品一区二区| 伊人色综合久久天天人守人婷 | yellow中文字幕久久网| 久久强奷乱码老熟女网站| 国产精品免费久久久久影院| 久久精品卫校国产小美女| 久久久久国产一区二区三区| 久久久久亚洲av无码专区喷水| 久久久久亚洲av毛片大| 国内精品久久久久久久97牛牛| 三级片免费观看久久| 国产精品免费久久| 国产精品一区二区久久不卡| 日产精品久久久久久久性色| 亚洲国产成人久久综合野外| 国内精品久久久久国产盗摄| 久久成人精品视频| 久久夜色精品国产欧美乱| 久久久久久综合网天天| 狠狠色丁香久久婷婷综合蜜芽五月 | 国产精品免费福利久久| 久久精品中文无码资源站| 久久精品国产男包| 午夜视频久久久久一区 | 色妞色综合久久夜夜| 77777亚洲午夜久久多喷| 亚洲人成精品久久久久| 久久国产色av免费看| 久久久一本精品99久久精品66| 偷窥少妇久久久久久久久| 久久久久久国产精品无码下载| 国产精品久久婷婷六月丁香|