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

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            久久久青草青青国产亚洲免观| 亚洲国产美女精品久久久久∴| 久久免费精品视频| 国产精品久久久福利| 国内精品久久久久久久coent | 91精品国产91久久| 久久精品综合网| MM131亚洲国产美女久久| 久久婷婷五月综合色99啪ak| 中文字幕无码精品亚洲资源网久久| 国产欧美一区二区久久| 手机看片久久高清国产日韩| 新狼窝色AV性久久久久久| 狠狠色综合久久久久尤物| 一本久久知道综合久久| 久久99精品久久久久久齐齐| 国产精品9999久久久久| 一本久久精品一区二区| 久久国产视屏| 亚洲狠狠综合久久| 色88久久久久高潮综合影院| 久久亚洲色一区二区三区| 亚洲午夜久久久精品影院| 国产精品免费福利久久| 久久亚洲AV无码精品色午夜| 久久综合色之久久综合| 久久国产乱子伦精品免费午夜| 国产91色综合久久免费分享| 色婷婷综合久久久中文字幕| 久久精品人人做人人爽电影| 看全色黄大色大片免费久久久| 欧美日韩中文字幕久久伊人| 精品久久久久香蕉网| 国产亚洲欧美精品久久久| 久久久久久久久波多野高潮| 久久香蕉国产线看观看猫咪?v| 99久久精品免费| 亚洲?V乱码久久精品蜜桃| 亚洲国产成人久久综合区| 久久精品二区| 久久久久亚洲国产|