关于C++中的placement new操作符

最近无意中看到一段代码,感觉很有趣,和大家分享一下。

#include <iostream>

class A{};

void f()
{
  char buf[sizeof(A)];
  new (buf)A();
}

int main()
{
  f();

  return 1;
}
代码可以看出,f()中在栈上申请了一块sizeof(A)大小的内存,new (buf)A(); 这句代码其实是重载operator new 操作符,意思是:在buf这个首地址调用构造函数但不并不申请内存。所以当f()调用结束时,栈上的内存被释放,但是并没有调用A的析构函数。

这里有两个地方需要注意:1> buf的空间不能小于A的空间,否则new调用失败。如果是对数组的操作,需要多预留sizeof(int)的空间,用来存储数组大小。2> 如果申请的空间分配在堆上,需要调用delete[] buf;来释放内存空间,防止内存泄漏。

适用场合:需要反复申请内存释放内存的地方,比如内存池,placement new 操作符可以节省分配内存的开销,从而提升一定的效率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值