解析new,operator new,placement new

解析new,operator new,placement new

new

new的一般操作为 A *p = new A,这样即开辟了一块空间,p指向这块空间(即p的值就是这块空间的首地址)。

这种new操作其实分为两步,第一步是用operator new申请空间(和malloc差不多),第二步是调用A的构造函数(当然还有返回指针)。这就是new的用法。

operator new

有时候我们还没有设计好一种类型(如模板类),但是上面的new又要用到类的构造函数,所以这时候可以直接用operator new来申请空间,例如 A *p = (A *)::operator new(sizeof(A))(里面还可以乘个n让p指向一大块空间),operator new是个函数所以可以重载,如果要使用默认的,直接在全局::里面找就行

placement new

有时候我们需要经常用到某种类型的指针,这个时候可能就要反复申请内存(或者说申请堆),而placement new就是提供一种机制来指定一个空间给某个对象用,例如我们已经有个指针mem了,我们可以A *p = new(mem) A,这样p指向的就是mem指向的空间,并且用了A的构造函数,但是p不能自动析构(不然把人家mem的内容都给整没了),所以如果要释放这块空间要显示析构p->~A()。

operator new与placement new的结合

因为operator new只是分配了空间,还没有构造,所以在分配空间后,明确了类型,我们可以使用placement new来为此调用构造函数。例如:A *p = (A *)::operator new(sizeof(A)),明确了类后,new§ A(argus),这样就完成了p所指对象的构造。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值