如何确定是否已使用placement new放置对象

Bit*_*rex 5 c++ placement-new

使用placement new语法,我应该能够做到这样的事情:

char *buffer  = new char[sizeof(MyClass)]; //pre-allocated buffer
MyClass *my_class = new (buffer) MyClass; //put da class there 
Run Code Online (Sandbox Code Playgroud)

现在假设我只做第一行,但不是第二行.是否有一种方法可以在代码中确定缓冲区是否已正确分配,但是尚未在那里实例化MyClass类型的对象?

Che*_*Alf 1

原始代码:

char *buffer  = new char[sizeof(MyClass)]; //pre-allocated buffer
MyClass *my_class = new (buffer) MyClass; //put da class there 
Run Code Online (Sandbox Code Playgroud)

为了动态确定是否已执行放置,new有关它的信息必须存储在某处。该语言不提供该服务。所以你必须自己做,通过两种可能的主要方式之一:

  • 将信息存储在缓冲区中。
    对于这种情况,缓冲区必须在分配时初始化。例如,只需()在表达式末尾添加即可new。否则无法保证缓冲区内容看起来不像对象。两个子案例:
    1. 通过在缓冲区中添加标志空间。
    2. 通过将标志作为对象的成员。
      在多态类的情况下,实际上会有一个非零 vtable 指针,它可以用作标志。
  • 外部存储信息。
    对于这种情况,缓冲区不需要在分配时初始化。有无数种可能性,包括
    1. 一个简单的bool变量。
    2. 指向所有此类对象的指针的集合。
    3. 向黑猩猩发出声音信号,随后进行询问。