前言:请大家先看一下文章 C++中operator new、new、new operator的区别,方便对本节的理解。
placement new是什么?
一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间。申请所得的空间的位置是根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在已分配的特定内存创建对象,这就是所谓的定位放置new(placement new)操作。
普通new操作: A* p=new A; 定位放置new:A* p=new (ptr)A;其中ptr就是程序员指定的内存首地址
placement new 和 operator new 有什么关系?
从其具体实现上来看,placement new是operator new的一种具体实现。 operator new分为三种形式(前2种不调用构造函数,这点区别于new operator): void* operator new (std::size_t size) throw (std::bad_alloc); void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw(); void* operator new (std::size_t size, void* ptr) throw();
对于第一种实现方案完成的任务如下: 分配size个字节的存储空间,并将对象类型进行内存对齐。如果成功,返回一个非空的指针指向首地址。失败抛出bad_alloc异常。 使用形式:A* a = new A;
对于第二种实现方案完成的任务如下: 在分配失败时不抛出异常,它返回一个NULL指针(与第一种实现方案的区别)。 使用形式:A* a = new(std::nothrow) A;
对于第三种实现方案(placement new)完成的任务如下: 它不分配内存,调用合适的构造函数在ptr所指的地方构造一个对象,之后返回实参指针ptr。 使用形式:new (p)A(); // new (p)A()调用placement new之后,还会在p上调用A::A()
参考: C++中使用placement new.
|