operator new
和operator new[]
具有相同的函數原型:void * (size_t size)
。當我要超載它們時,我應該注意什麼?在C++中重載operator new和operator new []有什麼區別?
如果我只是過載operator new
?
過載operator delete
和operator delete[]
有什麼區別?
operator new
和operator new[]
具有相同的函數原型:void * (size_t size)
。當我要超載它們時,我應該注意什麼?在C++中重載operator new和operator new []有什麼區別?
如果我只是過載operator new
?
過載operator delete
和operator delete[]
有什麼區別?
operator new
用於創建單個對象,如:
my_class* p = new my_class;
operator new[]
用於創建對象的數組,如:
my_class* p = new my_class[10];
是這樣確定的,如果我只重載operator新?
這取決於您是否需要特別處理陣列版本(operator new[]
)。默認operator new[]
將撥打operator new
。
基本上,如果你需要重載operator new
,最好也重載operator new[]
,因爲如果你想實現你自己的內存管理,最好保持它們的一致性。並且不要忘記nothrow和placement版本(因爲只有成員函數,全球版本不能移動)。
對於operator delete
和operator delete[]
也是如此。
'operator new []'默認已經調用'operator new'。不支持的版本默認已經調用相應的投擲版本。放置形式('void * operator new(std :: size_t size,void * ptr)noexcept;'和friends)根本不能被替換。 –
@ T.C。因此,答案是「如果我只重載操作符new,那麼行嗎?」應該是的? – songyuanyao
operator new調用構造函數,但數組版本是否也調用構造函數? – jayatubi
new創建一個實例,而new []創建一個數組。
與new相比,new []幾乎沒有什麼內存開銷來存儲數組的大小。
您不能使用帶有新[]的非默認構造函數。
新必須使用刪除。
new []必須與delete []一起使用。
另一個區別:
新[]是一個操作符分配和初始化對象的數組和一個指針返回到第一個元件。
這從具有相同的行爲的新的運營商不同,但對於一個分配,而不是陣列
如果一個單一對象,一個是用於陣列。 –