簡體   English   中英

C ++中的“ new”運算符何時調用構造函數

[英]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 []如何知道要銷毀多少元素?

http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/libsupc%2B%2B/new_opv.cc?revision=195701&view=markup

我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM