2010-05-31 26 views
3

我知道,新的操作符會調用類的構造函數。運營商如何調用類的構造函數?

但是,它是如何發生的,什麼是用於此的地平面技術。

+1

看到[這個答案](http://stackoverflow.com/questions/2697892/what-is-return-type-of-new-in-c/2697929#2697929)到一個類似的問題。基本上,你需要明白有一個__new表達式___和一個__new操作符___,它們是相關的,但不相同。 _ new expression_首先調用_operator new_,然後調用_constructor_。 – sbi 2010-05-31 09:04:55

回答

1

編譯器爲此生成機器碼。當編譯器看到

CSomeClass* object = new CSomeClass(); 

新語句)它生成的代碼調用適當的operator new()(其中分配內存),調用合適的構造,在例外的情況下調用所有完全構造子對象的析構函數,調用operator delete()在施工期間發生異常的情況下。所有這些都是由C++編譯器爲簡單查看語句生成的額外機器代碼完成的。

5

這裏是我想象:

T* the_new_operator(args) 
{ 
    void* memory = operator new(sizeof(T)); 
    T* object; 
    try 
    { 
     object = new(memory) T(args); // (*) 
    } 
    catch (...) 
    { 
     operator delete(memory); 
     throw; 
    } 
    return object; 
} 

(*)從技術上講,它不是真正的呼喚投放新的,但只要你不超載的是,心理優良樣板工程:)

+0

這是非常簡化的,並沒有反映出這樣的事實,即當拋出異常時,所有*完全構造的子對象都在運行析構函數。雖然我無法想象你如何能夠在預科碼中說明這一點。 – sharptooth 2010-05-31 07:24:32

+3

@sharp但是這正是任何構造函數總是這樣做的,無論內存來自哪裏。新運營商不必專門做這件事。 – fredoverflow 2010-05-31 07:35:43

3

這不是真正的調用構造函數的新運算符。更是翻譯以下行的編譯器:

MyClass * mine = new MyClass(); 

爲以下:

MyClass * mine = malloc(sizeof(MyClass)); // Allocates memory 
mine->MyClass();       // Calls constructor 

與其他錯誤處理,其他的答案已經注意到代碼。

+3

不,不是'malloc()' - 'operator new()'就是所謂的。差別很大(例如,您可以爲每個類重載'operator new()')。 – sharptooth 2010-05-31 07:37:46

+0

確實如此,但爲了簡單起見,我使用了'malloc()',並試圖指出它只是分配一堆內存的問題。沒有其他的。重載'operator new'是更高級的考慮因素,我不會將這個更低層次的問題作爲當前的解釋來使用。 – 2010-05-31 07:50:35

+1

不幸的是,'malloc'這個名稱比'operator new'好很多,因爲後者經常和新的操作符混淆...... :( – fredoverflow 2010-05-31 10:15:29