在C++中奇怪地使用构造函数

enc*_*enc 5 c++ constructor

我正在尝试理解用C++编写的其他人的代码,但是我从未见过构造函数的奇怪用法.代码如下所示:

A* a = new A(some initial values...);
...
B* b = new (a) B(some initial values...);
Run Code Online (Sandbox Code Playgroud)

初始化变量时b,(a)new和之间B(...).这是什么意思?

Nia*_*all 7

代码行:

B* b = new (a) B(some initial values...);
Run Code Online (Sandbox Code Playgroud)

正在使用"放置新".

默认行为; 它在与对象B相同的内存位置创建类型的新对象a.如果对于placement new有相关的重载,那么行为将在重载中编码,这也可能包括一些默认类型行为.

需要与任何过载被视为代码,对象的存储器布局,以及如何类AB彼此相关.

在先前创建的对象的位置上创建对象是不常见的.我想在这里介绍的这两个代码之间有一些代码解构(但仍然将内存"分配")前一个对象,a然后再构造新的对象.

isocpp FAQ对使用这一技术及其危险的一些进一步的建议.

  • 它不一定在同一个位置创建它,可能会有一个`operator new(size_t,A*)`的重载,它完全不同(例如调用`return a-> allocate(sizeof(B))`) (3认同)
  • @ Selman22.取决于其他代码.坦率地说,我认为代码闻起来. (2认同)