placement new
它们其实是c++ 预先重载的operator new 函数,它的实现很简单如下
void* operator new(size_t , void* p) {
return p;
}
使用场景
void* p = malloc(sizeof(T));
T* object = new(p) T;
虽然实现很简单,但是它有很大的魔力,它可以让我们在一个已分配好的内存上构造对象。STL 中的容器就是这么实现的,内存通过空间配置器申请,然后通过placement new来构造对象,这样就造就了STL 空间配置器,其中内存由STL 自己管理。
坑
1.若该空间 object 已存在,使用该空间调用 placement new ,还是会继续构造object,但是并不会调用 析构函数释放老的object,这样就造成了内存泄漏
T object;
new(&object) T;
2.如传来的ptr是非法的行为未定义
3.不支持多态,或者说多态支持不完善。下面的这个列子,按说现在是Dervied对象了,应调用的是 Dervied::f 但是实际上调用的是Base::f
c++ 对象模型列子
Base b;
b.f();
b.~Base();
new (&b) Dervied;
b.f();