位置new用于初始化原地对象

Placement new to initialize inplace object

本文关键字:原地 对象 初始化 用于 new 位置      更新时间:2023-10-16

我最近遇到了一种相当有趣的序列化方法,它利用未初始化变量的透明性(编译器中常见的未定义行为?)来实现"有效的"反序列化。

内存被分配和分配一个预定的值。然后使用放置new来实例化一个结构(例如一个复杂的原位数据结构)将未初始化的变量"初始化"为底层内存的值。(见下面的代码)

除了相当危险和可能不是一个非常令人愉快的编码惯例之外…我想知道有没有人见过这个方法更重要的是,它叫什么?

class SomeClass {
public:
  SomeClass() {}
  int someInt;
};
int main(...) {
  int dummy = 42;
  int *pSomeClass = new (&dummy) SomeClass();
  cout << pSomeClass->someInt << endl;
}

这将打印数字42…neato !

这就是所谓的"依赖UB",用外行人的话来说,就是"愚蠢"。

我在eCos和RTOS中见过这样初始化一些内核对象。

正如Tomalak指出的,缺点之一是不允许虚函数。他们试图通过测试相等大小的sizeof(kernel object) == sizeof(variable used for initialization) .

他们的代码要复杂得多,使用C结构体来模拟c++类的C接口成员变量,而不是使用C函数来获取/设置c++类中的变量

尽管他们的行为完全相反,但他们使用了c++类中的值,在构造函数中设置,来填充placement new中的内存。

我不建议这样做。