placement new

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那就必须提前开辟一片空间。

参考:

operator new – cpppreference

operator new – cplusplus

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值