2012-08-22 59 views
1

在派生類對象被創建時,哪個空間首先被分配?基類和派生類構造函數的內存分配

無論是基類構造函數還是派生類構造函數?

+1

[首先,請參閱此處瞭解更多詳細信息](http://stackoverflow.com/questions/2517050/c-construction-and-initialization-order-guarantees) – tmpearce

+0

@ close-voter:不,分配不是與初始化相同。不要根據你不知道的感覺投票。只對你知道的事情投票。 –

+0

@ Cheersandhth.-Alf(首先,不,我不是近親選民)我猜根據關於*構造函數*的措詞,分配和初始化的術語可能混淆在問題中,因此鏈接......也許不是。無論如何,我在下面找到您的答案,以提供信息,+1 – tmpearce

回答

-1

正如評論中提到的那樣,它是基類。從邏輯上講,由於您可以訪問Derived類(包括構造函數)中的基本公共和受保護成員,因此需要先分配它。嘗試從下面的代碼開始玩遊戲。

#include <iostream> 

class Base 
{ 
    public: 
    Base() {std::cout<<"Base CTOR" << std::endl;} 
}; 

class Derived : public Base 
{ 
    public: 
    Derived():Base() {std::cout<<"Derived CTOR"<<std::endl;} 
}; 

int main(int argc, char* argv[]) 
{ 
    Derived d; 
} 
+0

此代碼查看構建順序,而不是內存分配。 –

+0

-1實際上,一個對象的所有內存一次分配爲一個塊。 –

1

派生對象的空間包含所有派生成員和所有基礎成員。派生對象只有一個分配,分配的內存保存對象的所有部分。

5

首先,

  • 分配,存儲器的保留您’重新詢問,不同於和先初始化(其基本上設置在該存儲器適當值的構造器的執行) ,

  • 正式(我們的神聖標準)和實際上在上有區別對於最衍生對象的內存是否需要連續,其中正式定義的「區域的內存」儘可能不連續,主要是爲了支持多個虛擬繼承。

這就是說,在實踐中,最派生對象是存儲器的單個的,連續的存儲塊,它包括空間對所有基類的子對象和數據成員的子對象,並且該塊是一定分配所有立刻。

初始化(調用構造函數)在分配後進行。如果通過拋出異常來初始化失敗,則new表達式將保證解除分配。然而,如果所採用的分配功能具有額外的自定義參數(所謂的「放置新的」)並且沒有相應的解除分配功能可用,則該擔保是無效的,如同例如。用於早期版本的微軟構建MFC類框架(這非常具有諷刺意味:初始化失敗的程序只會在調試版本中泄漏內存&hellip;)。

+0

對於不需要提問的人來說,這是一個很好的答案;-) –

相關問題