c++ - placement new 如何在指定内存上构造对象
PHPz
PHPz 2017-04-17 15:21:05
0
2
560
// Default placement versions of operator new.
inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }

如上,查看gcc中stl的源代码的实现方式。placement new 只是返回__p指针。若

class XX
{
    //define ctor,dctor here
    //data member
};
char buf[sizeof(XX)];
XX* ptr = new(buf) XX();

像上面这样使用placement new,请问XX是如何在那个指定的内存buf上完成构造的呢?明明只是把指针返回了啊。

PHPz
PHPz

学习是最好的投资!

全部回覆(2)
伊谢尔伦

首先,你這裡的呼叫的placement new不是頭檔new中定義的那個placement new。你得寫::operator new(...);才行。

然後關於這個placement new,C++標準中有如下聲明(C++11):
18.6.1.3 Placement forms [new.delete.placement]
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) do not apply to these reserved placement forms of operator new and operator delete.

大意是說,這些函數是保留在那的,不能動,目前沒什麼用。
大家讲道理

考慮結構體如何初始化的問題。
只要分配好內存,你就可以把這段內存reinterpret_cast成你想要的類型,這個過程就讓類別的成員變數有了自己的內存空間,然後再調用這個類型的構造函數就可以了,原理就是這樣。你自己也可以手動實作一個placement new

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!