使用 placement new 创建指向静态内存缓冲区的静态 const 指针

Use placement new to create a static const pointer to a static memory buffer

我想初始化一个指向 class 类型 MyClass2 对象的静态常量指针,它在实例化时存储在 class MyClass1 的静态数据缓冲区中。

这行不通:

class MyClass1 {
   public:
       MyClass1()
       {
           _my_class_2_ptr = new (_my_class_2_buf) MyClass2();
       }

   private:
      static MyClass2 *const  _my_class_2_ptr;
      static char *_my_class_2_buf = new char[sizeof(MyClass2)]; 
};

有没有办法完成这样的事情?

当你的变量是静态的,你不能在构造函数中初始化它们。这根本没有意义!你想做的是

(在header)

class MyClass1 {
   // member    
   public:
      static MyClass2 *const  _my_class_2_ptr;
      static std::aligned_storage_t<sizeof(MyClass2)> _my_class_2_buf; 
};

(以 cpp 为单位)

std::aligned_storage_t<sizeof(MyClass2)> MyClass1::_my_class_2_buf;
MyClass2* const MyClass1::_my_class_2_ptr = new (&MyClass1::_my_class_2_buf) MyClass2;

您可以将 static 成员变量的定义和初始化移动到 class 之外。

class MyClass1 {
   public:
       MyClass1() {}

   private:
      static MyClass2 *const  _my_class_2_ptr;
      static char *_my_class_2_buf; 
};

char *MyClass2::_my_class_2_buf = new char[sizeof(MyClass2)]; 
MyClass2 *const  MyClass1::_my_class_2_ptr = new (_my_class_2_buf) MyClass2();