C 物件的記憶體分析(6)

2021-07-13 09:36:10 字數 960 閱讀 4517

c++物件的記憶體分析(6)

binhua liu

本節討論建構函式,析構函式和虛析構函式。可能很多人都有這樣的經歷,面試時經常被問到:什麼情況下要使用虛析構函式,為什麼要使用虛析構函式?本文將試圖對編譯器的實現機制進行分析,來回答這個問題。

我們從例子來分析,首先我們來看下面這個繼承鏈:

**如下:

class cbasic

反編譯我們可以看到,csenior s被編譯為:

012b164e  lea         ecx,[s] 

012b1651 call csenior::csenior (12b1221h)

請注意,operator new並沒有被呼叫,因為物件所佔記憶體是函式在堆疊上為其預留的。

當main函式結束時,下面的**自動新增在函式的結尾:

012b1656  lea         ecx,[s] 

012b1659 call csenior::~csenior (12b1109h)

函式並沒有呼叫csenior::`scalar deleting destructor' 方法而是直接呼叫了csenior::~csenior方法,這也很好理解,因為函式將自動**所有在堆疊上分配的記憶體,不需要也不能使用operator delete函式來進行**,事實上,operator delete方法是在堆(heap)上分配記憶體時使用的。

本章節是c++物件的記憶體分析的最後一節,我為此感到長舒一口氣。再次體會到,寫文章是件很辛苦的事,不過我會堅持,希望能為社群提供有價值的知識,我將以這種方式對我以前和將來google出來的所有好的技術文章和他們的作者致敬。

C 物件的記憶體分析(6)

本節討論建構函式,析構函式和虛析構函式。可能很多人都有這樣的經歷,面試時經常被問到 什麼情況下要使用虛析構函式,為什麼要使用虛析構函式?本文將試圖對編譯器的實現機制進行分析,來回答這個問題。我們從例子來分析,首先我們來看下面這個繼承鏈 如下 class cbasic 反編譯我們可以看到,csenio...

C 物件的記憶體分析(5)

c 物件的記憶體分析 5 binhua liu 這裡我準備只主要闡述介面,而不談一般的抽象類。因為在c 中,是沒有 介面 這種型別的,所有的介面事實上是定義為純抽象類。所謂純抽象類,就是沒有成員變數,沒有實現了的函式,只有純虛函式的抽象類。我相信,理解了介面這種特殊的抽象類,再去理解一般的抽象類是很...

物件記憶體分析

定義乙個類,用來模擬 手機 事物。屬性 品牌,顏色 行為 打 發簡訊 對應到類中 成員變數 屬性 string brand 品牌 double price string color 顏色 成員變數 行為 public void call string who 打 public void sendme...