[英]C++ class constructor is called twice when new operator is overriden - why
[英]When is the constructor called by 'new' operator in C++
自從我開始學習C ++以來,我總是讀到'new'運算符在將指針返回到分配的內存之前會調用對象的構造函數。
因此,出於好奇,我檢查了源代碼中的“ new”,並在http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/libsupc%2B%2B/中找到了以下內容new_op.cc?revision=197380&view=markup
_GLIBCXX_WEAK_DEFINITION void *
operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc)
{
void *p;
/* malloc (0) is unpredictable; avoid it. */
if (sz == 0)
sz = 1;
p = (void *) malloc (sz);
while (p == 0)
{
new_handler handler = std::get_new_handler ();
if (! handler)
_GLIBCXX_THROW_OR_ABORT(bad_alloc());
handler ();
p = (void *) malloc (sz);
}
return p;
}
我看不到任何構造函數被調用或任何類型的機制來標識對象的類型。
那么,這是怎么做的呢? 編譯器通過在分配的內存上調用構造函數來發揮作用嗎? 任何幫助將不勝感激。
同樣,在new []的情況下(在下面的鏈接中),不會進行任何記錄來跟蹤數組中元素的數量。 那么,delete []如何知道要銷毀多少元素?
我在SO上經歷了許多相關問題,並在Google上進行了搜索,但找不到答案。
我看不到任何構造函數被調用或任何類型的機制來標識對象的類型。
operator new
功能的工作只是分配內存; 它不調用構造函數,甚至不知道將在內存中構造哪種類型的對象(如果有)。 只是告訴您要分配多少字節。
編譯器通過在分配的內存上調用構造函數來發揮作用嗎?
如果說“玩些花樣”是指“生成一些代碼”,那么是的。 如果使用new
-expression創建對象,那么它會做兩件事:
operator new()
為該對象分配足夠的內存; 同樣,在new []的情況下(在下面的鏈接中),不會進行任何記錄來跟蹤數組中元素的數量。 那么,delete []如何知道要銷毀多少元素?
new[]
表達式(不是operator new[]
)會將其記錄在某處。 確切的細節留給實現。
編譯器通過在分配的內存上調用構造函數來發揮作用嗎?
是的,上面看到的operator new
只是獲取內存塊的部分的實現。 在代碼中使用new T
時,編譯器將調用相應的operator new (size_t)
實現來獲取內存塊,然后在其上調用T
構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.