搜尋

首頁  >  問答  >  主體

c++ - 能否帮忙解释一下placement new的原型

void operator new( size_t, void *p ) throw() { return p; }

这是我查到关于placement new的原型,size_t为什么在“new(&str1) std::string("abc");”中没有体现?为什么直接return p就可以了,是因为这个函数并没有写完全(只是原型)吗?

天蓬老师天蓬老师2805 天前629

全部回覆(1)我來回復

  • 黄舟

    黄舟2017-04-17 15:41:48

    首先你找到的不是placement new的聲明,而是operator placement new的聲明。這些operator被聲明在頭檔new裡。

    關於operator placement new,C++11標準有以下約定:

    18.6.1.3.1 These functions are reserved, a C++ program may not define functions that displace the versions in the Standard C++ library (17.6.4). The provisions of (3.7.4) ++ library (17.6.4). The provisions of (3.7.4) do doly toapp these reserved placement forms of operator new and operator delete.

    簡言之,這些operator placement new暫時沒任何用處。

    然後,表達式new(&str1) std::string("abc")呼叫的並不是你找到的這個宣告(但這個表達式內部的確會呼叫operator placement new)。 operator placement new的呼叫方法是:::operator new(size, pointer);


    C++中存在兩種new,一種稱為new expression,另一種稱為operator new。前者會呼叫後者完成記憶體分配,然後建構物件。 operator new被定義在頭文件new中,如果程式未包含該頭文件,則編譯器會自動產生一套operator new。

    也就是說,placement new expression和new expression內部會分別調用operator placement new和operator new,前者目前不做“任何工作”,後者“應當”申請存儲區。 (通常類別重載operator new,就是重載的後者)

    回覆
    0
  • 取消回覆