operator new和placement new

new operator是new函数,有以下两个过程

1. 调用operator new分配空间

2. 调用构造函数

其中operator new是可以被重载的,每一个类都可以重载自己的operator new

placement new可以解决没有默认构造函数的情况,也可以用来减少malloc的开销

placement new的用法如下

/// 首先调用operator new开出一块内存

void *p = ::operator new(sizeof(Foo));

/// 然后用placement new就可以调用带参数的构造函数

Foo *foo = new(p) Foo(1);

placement new带的参数是一个指针,这个指针指向了之前分配好的一块空间,用operator new就可以

它所做的事情就是返回这个指针,后面跟踪进去的时候不知道为什么进入了Foo的构造函数,很神奇!想知道原因大概要看汇编了,不明白为什么,但总之能够调用带参数的构造函数了

下面是测试代码

#include <new>
#include <iostream>

using namespace std;

class Foo{
public:
    Foo(int i){
        cout << i << endl;
    }
};

int main(){
    void *buff = ::operator new(128);
    Foo *foo = new(buff) Foo(1);

    return 0;
}
原文地址:https://www.cnblogs.com/EpisodeXI/p/4182189.html