c++ - 如何在已分配的结构中调用 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 并保持底层数据结构隐藏并尽可能少地执行内部分配)
解决方案
是的,你就是这样做的。不仅适用于std::queue<>
您想要在预分配缓冲区上构建的任何对象。
在您的情况下,由于std::queue<>
是结构的一部分,因此以QueueData
这种方式构造对象将确保其成员m_queue
也被构造。请记住,此构造函数可能会分配内存。
不要忘记在释放缓冲区之前显式调用析构函数,否则会泄漏在构造函数上分配的内存,或者在std::queue
. 例如:
pData->~QueueData();
somethingThatDeallocatesTheBuffer(pData);
推荐阅读
- spring-boot - 在使用 Thymeleaf 作为视图技术的应用程序中访问 swagger-ui.html
- react-navigation - 如何删除堆栈导航器上的透明度?
- kubernetes - 创建自定义 helm 图表
- python - 这 2 个合并排序实现的空间复杂度是否相同?
- angular - How to give base url in angular when retrieve image from api
- java - Eclipse 与手动编译的区别
- arrays - Swift:TableView 单元格数据随按钮操作而变化
- php - 如何将日期字段设置为 3 个月前
- javascript - Svg 图标在每个浏览器上都可以点击,除了 firefox
- angular - Hyperledger Composer - Angular 应用程序的 Rest-Server-Api Local-Passport 策略不是 node.js?