想解释一段代码,很多人可能头次看着有点懵。
void* operator new(size_t size, MyHeap* heap) {
return heap->allocate(size);
}
int main() {
MyHeap heap;
std::unique_ptr<int> p(new(&heap) int(0));
return 0;
}
上面代码使用了placement new语法,别的可能都还好,看到new(&heap) int(0),第一次见的人可能微微一愣。我们换一个方式可能就更直观点:new int(0)。那么这里的new(&heap)就可以平替new的意思。这是在构造一个int指针,并将整数初始化为0。这里我们重载了运算符new。
new(&heap)调用了operator new(size_t size, MyHeap* heap),看到这里,size谁传入的呢?原来这个 size 参数是由编译器自动传入的,它表示要构造的对象的大小。你不需要手动指定它,也不能改变它。你的代码中的 new(&heap) 会传入 sizeof(int) 作为 size 参数,因为你要构造的对象是 int 类型的。&heap以第二个参数传入。