C++内存管理8-placement_new

//Complex类
class Complex{
    public:
        int i;
        int j;
        Complex(){}
        Complex(int i,int j):i(i),j(j){cout<<"i:"<<i<<" "<<"j:"<<j<<endl;}
        ~Complex(){cout<<"free"<<endl;}
};

placement new 允许我们将对象建构在一个已经分配的内存中。是一种定点(即提前分配好空间的)new

#include <iostream>
#include <new>//引入new头文件
using namespace std;
int main(){
    char* buf=new char[sizeof(Complex)*3];
    Complex* pc=new(buf)Complex(1,2);//结果is i:1 j:2
    delete [] buf;
    return 0;
}

这个buf是已经分配好的空间,这个Complex对象是建在buf上面。
这个buf已经分配好所以不会再分配内存。

Complex* pc=new(buf)Complex(1,2);
//这一行被编译器转为下面的形式
try
{
	void* mem = operator new(sizeof(Complex),buf);//allocate
	pc=static_cast<Complex*>(mem);//cast转换类型
	pc->Complex::Complex(1,2);//construct调用构造函数
}
catch(std::bad_alloc){
	//若allocation失败则不执行构造函数
}

operator new的源码:不做事。因为已经分配好了空间。

void* operator new(size_t,void* loc)
{return loc;}

因为placement new没有分配内存所以就没有placement delete
而buf分配了内存所以buf要delete
placement new具体指的是
new§或者
::operator new(size,void*)

以上来自侯捷老师视频仅用于学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值