用彙編的眼光看C++(之class構造、析構)09

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】  

 

    前面我們討論基本上都是C語言的內容,還沒有真正觸及到C++的相關知識。從這篇部落格之後,我們將會更多觸及類的內容。類的屬性很多,今天我們討論主要就是建構函式、解構函式。

    

    (1)如果沒有建構函式、解構函式呢?

[cpp] view plaincopy
  1. class apple  
  2. {  
  3. public:  
  4.     void print() const {return;}  
  5. };  

    雖然這個類沒有什麼意義,但是如果用sizeof計算一下大小的話,我們發現它還是佔了一個位元組。那麼如果有一個apple的變數呢?為了讓apple的變數有意義,我們嘗試做一個改變:

[cpp] view plaincopy
  1. 66:       apple a;  
  2. 67:       a.print();  
  3. 00401248   lea         ecx,[ebp-4]  
  4. 0040124B   call        @ILT+0(apple::print) (00401005)  
  5. 68:       return;  
  6. 69:   }  

    我們看到,堆棧分配了四個位元組空間給a,就是ebp下面的一個位元組。

 

    (2) 解構函式什麼時候調用?

[cpp] view plaincopy
  1. class apple  
  2. {  
  3. public:  
  4.     apple() {printf("apple()!\n");}  
  5.     ~apple() {printf("~apple()!\n");}  
  6.     void print() const {return;}  
  7. };  

    如果調用呢,我們可以做一個測試環境,如下所示:

[cpp] view plaincopy
  1. 68:       apple a;  
  2. 0040126D   lea         ecx,[ebp-10h]  
  3. 00401270   call        @ILT+65(apple::apple) (00401046)  
  4. 00401275   mov         dword ptr [ebp-4],0  
  5. 69:       {  
  6. 70:           apple b;  
  7. 0040127C   lea         ecx,[b]  
  8. 0040127F   call        @ILT+65(apple::apple) (00401046)  
  9. 71:       }  
  10. 00401284   lea         ecx,[b]  
  11. 00401287   call        @ILT+0(apple::~apple) (00401005)  
  12. 0040128C   mov         dword ptr [ebp-4],0FFFFFFFFh  
  13. 72:   }  
  14. 00401293   lea         ecx,[ebp-10h]  
  15. 00401296   call        @ILT+0(apple::~apple) (00401005)  
  16. 0040129B   mov         ecx,dword ptr [ebp-0Ch]  
  17. 0040129E   mov         dword ptr fs:[0],ecx  

    我們看到,只要出了範圍,解構函式就會自動會被調用。

 

    (3)如果是new調用類,解構函式會自動調用嗎?

    不會。

 

    (4)建構函式、解構函式的本質?

    我們知道在函數中的臨時變數在堆棧裡面應用的時候都需要初始化處理的,在堆棧返回的時候會被自動收回。那麼建構函式和解構函式?其實是一樣的,在函數調 用的時候,堆棧也會為這樣一個類準備大小合適的堆棧,然後調用建構函式對這樣的一片記憶體進行初始化處理,在函數return的時候,調用另外一個函數對可 能涉及到的資源進行一次清理。這裡指的資源不是指記憶體空間,而是指廣義意義上的系統資源、比如說IO、socket、鎖、畫筆、對話方塊控制代碼等等。所以,通 常而言,如果你在解構函式裡面沒有及時對資源進行分配,那麼就會造成資源的泄露。這一切只有等到程式結束的時候才會重新回到系統的手中,不過如果一個程式 佔有太多的資源,那麼勢必會對別的程式造成影響。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.