C++ 如何在std::queue上调用构造函数<&燃气轮机;那';在一个';已经分配了

C++ 如何在std::queue上调用构造函数<&燃气轮机;那';在一个';已经分配了,c++,C++,假设我有一个来源未知的结构(可能是堆栈,可能是堆,等等),可能只是指向内存中分配的缓冲区: struct QueueData{ HANDLE hSemaphore; HANDLE hMutex; std::queue<void*> m_queue; }; 让它调用构造函数 初始化已预分配的std:queue的正确语法是什么 (请注意,我明白我是在诱惑UB的神,但底层代码使用windows API调用模拟RTOS,隐藏底层数据结构,并尽可能少地执行内部

假设我有一个来源未知的结构(可能是堆栈,可能是堆,等等),可能只是指向内存中分配的缓冲区:

  struct QueueData{
    HANDLE hSemaphore;
    HANDLE hMutex;
    std::queue<void*> m_queue;
  };
让它调用构造函数

初始化已预分配的std:queue的正确语法是什么


(请注意,我明白我是在诱惑UB的神,但底层代码使用windows API调用模拟RTOS,隐藏底层数据结构,并尽可能少地执行内部alloc)

是的,这就是您的做法。不仅适用于
std::queue
,而且适用于要在预分配的缓冲区上构造的任何对象

在您的例子中,由于
std::queue
是结构的一部分,因此以这种方式构造
QueueData
对象将确保其成员
m_queue
也被构造。请记住,此构造函数可能会分配内存

不要忘记在释放缓冲区之前显式调用析构函数,否则会泄漏构造函数上分配的内存,或者在
std::queue
的正常操作期间。例如:

pData->~QueueData();
somethingThatDeallocatesTheBuffer(pData);

你正在使用的新位置就是这样做的。您可以稍微简化一下,然后使用
QueueData*pData=new(pPreAllocatedMemoryThatsBigEnoughToHoldQueueData)QueueData()new(&pdata->m_queue)std::queue,但您现在拥有的更好。编译器在两个版本上生成的代码可能是相同的,因此我不确定您所说的“间接”是什么,但构建整个结构在语义上更正确(想象一下,在您已经介绍过的第一个版本中,将来您将在结构中添加一个
std::vector
。@ivella对此表示感谢。是的,回想起来,正确的做法是“构造”结构并在我的对象的删除函数中对其进行销毁。
pData = new (pData) QueueData();
pData->~QueueData();
somethingThatDeallocatesTheBuffer(pData);