什么是C++中的就地构造函数?

Akh*_*hil 20 c++ constructor in-place placement-new

可能重复:
C++的"放置新"

什么是C++中的就地构造函数?

例如Datatype*x = new(y)Datatype();

lin*_*r27 42

这称为放置新运算符.它允许您提供数据将被分配的内存,而无需new操作员分配.例如:

Foo * f = new Foo();
Run Code Online (Sandbox Code Playgroud)

以上将为您分配内存.

void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo(); 
Run Code Online (Sandbox Code Playgroud)

以上将使用调用分配的内存malloc. new将不再分配.但是,您不限于课程.对于通过调用分配的任何类型,您都可以使用placement new运算符new.

放置新的'gotcha'是您不应该使用delete关键字释放通过调用placement new运算符分配的内存.您将通过直接调用析构函数来销毁该对象.

f->~Foo();
Run Code Online (Sandbox Code Playgroud)

  • 是的.另请参阅[此答案](http://stackoverflow.com/questions/2697892/what-is-return-type-of-new-in-c/2697929#2697929)了解_new expression_和实际内存分配之间的区别. (2认同)
  • "`new`将不再分配." - 对于作为固定大小的对象的对象 - 当然,如果对象需要它,它将分配动态内存 - 字符串,帧缓冲区,数据库等等. (2认同)
  • 确保包含标头“<new>”! (2认同)

Mic*_*fik 7

简短的回答是你的代码在指向的空间中构造一个对象y.C++常见问题解答最好地涵盖了长答案.