Placement new用于初始化inplace对象

时间:2011-10-31 17:03:27

标签: c++ new-operator undefined initialization placement

我最近遇到了一个相当有趣的序列化方法,利用未初始化变量的透明度(编译器中常见的未定义行为?)进行“高效”反序列化。

分配内存并分配预定值。然后使用Placement new来实例化一个结构(例如一个复杂的就地数据结构),将未初始化的变量“初始化”为底层内存的值。 (见下面的代码)

除了风险很大,而且可能不是一个非常令人愉快的编码约定......我只是想知道是否有人遇到过这种方法或更重要的是 - 它叫什么?

class SomeClass {
public:
  SomeClass() {}

  int someInt;
};

int main(...) {
  int dummy = 42;

  int *pSomeClass = new (&dummy) SomeClass();
  cout << pSomeClass->someInt << endl;
}

这将打印出数字42 ... neato!

2 个答案:

答案 0 :(得分:5)

它被称为“依赖UB”,或者用外行人的话说,是“愚蠢”。

答案 1 :(得分:2)

我已经在eCos(RTOS)中看到了这一点,以初始化它们的一些内核对象。

正如Tomalak所指出的,其中一个缺点是不允许虚拟功能。 他们试图通过测试相同大小sizeof(kernel object) == sizeof(variable used for initialization)来确保。

他们的代码虽然使用C-struct来模仿c接口的C ++类成员变量而不是使用C函数来获取/设置C ++类中的变量,但更复杂[/ p>

虽然他们的行为恰恰相反,但他们使用了构造函数中设置的C ++类中的值来填充placement new的内存。

我不建议这样做。