首页 > 解决方案 > 如何在已分配的结构中调用 std::queue<> 上的构造函数

问题描述

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

  struct QueueData{
    HANDLE hSemaphore;
    HANDLE hMutex;
    std::queue<void*> m_queue;
  };

它交给了我,我如何调用队列中的构造函数,以便适当地初始化它的内部成员?

QueueData *pData = (QueueData*)pPreAllocatedMemoryThatsBigEnoughToHoldQueueData;
pData->m_queue = std::queue<void*>();

不工作。我假设正在堆栈上创建一个有效格式的 std::queue,但分配失败,因为我的结构中的实例中有未知数据。

我尝试了一段时间试图找到一种方法来显式调用构造函数,但不能。

我最终在 pData 上做了一个就地新的:

pData = new (pData) QueueData();

让它调用构造函数。

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

(请注意,我知道我在诱惑 UB 的众神,但底层代码是使用 Windows API 调用模拟 RTOS 并保持底层数据结构隐藏并尽可能少地执行内部分配)

标签: c++

解决方案


是的,你就是这样做的。不仅适用于std::queue<>您想要在预分配缓冲区上构建的任何对象。

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

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

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

推荐阅读