定位new 及其重载

 

//定位new  placement new
//功能:在已分配好的原始内存中初始化一个对象
//所做的事情:
//(1)内存已经分配,定位new并不分配内存,需要提前将这个定位new要是用的内存分配出来
//(2)初始化一个对象(的内存),也可以说是调用这个对象的构造函数
//格式:
//new (地址) 类类型();
class A
{
    A(){}
    ~A(){}
};
void* pvoid = (void*)new char[sizeof(A)];   // 先分配出内存
A* pa = new (pvoid) A();   // 调用无参构造函数,这里不会额外分配内存
// 相当于覆盖了原来的那块内存

//释放内存
delete pa;   // 传统方式也行

pa->~A();   // 析构函数可以手动调用,构造函数不能手动调用
delete[](void*) pa;  // 手动释放,更灵活

// 定位new 的重载
// 定位new没有对应的定位delete
void* operator new(size_t size, void* pvoid)
{
    return pvoid;  // 将收到的地址返回回去
}

 

posted @ 2020-07-02 23:04  min_zhi  阅读(80)  评论(0编辑  收藏