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()有没有办法直接对std::queue而不是包含它的结构执行此操作?(我想这真的是我的问题。想要避免间接修改)从技术上讲,这是错误的,因为该结构的其他字段将是未初始化的。您可以执行new(&pdata->m_queue)std::queue代码>,但您现在拥有的更好。编译器在两个版本上生成的代码可能是相同的,因此我不确定您所说的“间接”是什么,但构建整个结构在语义上更正确(想象一下,在您已经介绍过的第一个版本中,将来您将在结构中添加一个std::vector
。@ivella对此表示感谢。是的,回想起来,正确的做法是“构造”结构并在我的对象的删除函数中对其进行销毁。
pData = new (pData) QueueData();
pData->~QueueData();
somethingThatDeallocatesTheBuffer(pData);