placement new
operator new
1.void* operator new (std::size_t size);
2.void* operator new(std::size_t size,const std::nothrow_t& nothrow_value) noexcept;
3.void* operator new (std::size_t size, void* ptr) noexcept;
通过operator new -cplusplus我们可以得知,以上为new的三种重载函数。
我们今天所说的placement new其实是第3个重载函数。
void operator new(std::size_t size,void* ptr) noexcept;
通过查询标准库中的new
文件我们可以看到该函数的实现为:
// Default placement versions of operator new.
inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
我们只是以单对象为例,可以看出该函数没有malloc
,也没有调用其他new
函数,而是单纯的返回不更改的第二参数。所以我们推断该指针指向的是已开辟的空间。
所以,我们看到的new(p) T;
中的p指向已开辟的空间。
在<std_construct.h>
中,存在这样一段代码:
template<class T1,class t2>
inline void construct(T1* p,const T2& value){
new(p) T1(value);
}
我们就不难知道,nwe(p) T1(value);
就是将T类型初值设为value并设定到指针p所指向的空间上。
所以说,要使用placement new
那就必须提前开辟一片空间。