回答
編譯器爲此生成機器碼。當編譯器看到
CSomeClass* object = new CSomeClass();
(新語句)它生成的代碼調用適當的operator new()
(其中分配內存),調用合適的構造,在例外的情況下調用所有完全構造子對象的析構函數,調用operator delete()
在施工期間發生異常的情況下。所有這些都是由C++編譯器爲簡單查看語句生成的額外機器代碼完成的。
這裏是我想象:
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;
}
(*)從技術上講,它不是真正的呼喚投放新的,但只要你不超載的是,心理優良樣板工程:)
這是非常簡化的,並沒有反映出這樣的事實,即當拋出異常時,所有*完全構造的子對象都在運行析構函數。雖然我無法想象你如何能夠在預科碼中說明這一點。 – sharptooth 2010-05-31 07:24:32
@sharp但是這正是任何構造函數總是這樣做的,無論內存來自哪裏。新運營商不必專門做這件事。 – fredoverflow 2010-05-31 07:35:43
這不是真正的調用構造函數的新運算符。更是翻譯以下行的編譯器:
MyClass * mine = new MyClass();
爲以下:
MyClass * mine = malloc(sizeof(MyClass)); // Allocates memory
mine->MyClass(); // Calls constructor
與其他錯誤處理,其他的答案已經注意到代碼。
不,不是'malloc()' - 'operator new()'就是所謂的。差別很大(例如,您可以爲每個類重載'operator new()')。 – sharptooth 2010-05-31 07:37:46
確實如此,但爲了簡單起見,我使用了'malloc()',並試圖指出它只是分配一堆內存的問題。沒有其他的。重載'operator new'是更高級的考慮因素,我不會將這個更低層次的問題作爲當前的解釋來使用。 – 2010-05-31 07:50:35
不幸的是,'malloc'這個名稱比'operator new'好很多,因爲後者經常和新的操作符混淆...... :( – fredoverflow 2010-05-31 10:15:29
- 1. 運營商和構造函數
- 2. 移動構造/運營商=
- 3. 使用*運營商在函數調用
- 4. 一對函數調用運營商
- 5. 與運營商的拷貝構造函數=
- 6. 錯誤與拷貝構造函數和平等的運營商
- 7. C++鑄造運營商和傳統的C鑄造運營商
- 8. 關於構造函數和指定運營商在C++
- 9. 敵不過運營商=,構造函數創建一個指針
- 10. 運營商<<重載在構造函數中
- 11. C++ /析構函數 - 運營商刪除
- 12. Java:如何調用子類構造函數內的超類構造函數?
- 13. 運營商在模板函數類
- 14. 如何在構造函數類擴展時從類調用構造函數?
- 15. 在構造函數中調用類成員的構造函數
- 16. 在構造函數中調用不同類的構造函數?
- 17. 從不同類的構造函數調用構造函數
- 18. 使用運營商的「新」在QObject的構造函數(多線程)
- 19. 運營商函數文本
- 20. 調用類運營商直接
- 21. OOP - 如何調用一個函數類的構造函數
- 22. 在父構造函數之前調用子類構造函數
- 23. Move構造函數調用基類移動構造函數
- 24. 如何在其他構造函數中調用構造函數?
- 25. 迭代器複製構造函數錯誤,如右側'非法'。運營商
- 26. $運營商給出的數據構造錯誤
- 27. Bigint類運營商
- 28. String類+運營商
- 29. 調用模板類的構造函數
- 30. 無法調用類的構造函數
看到[這個答案](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