为指向struct PWS类型vector的指针分配内存,现有写法是否正确?
问题结论与错误分析
你给出的代码写法完全错误,存在以下核心问题:
- 内存分配大小计算逻辑完全错误
你当前写的sizeof(vector<PWS>*)是「vector指针的大小」(通常为8字节/4字节),如果你的目标是创建1个指向vector的指针,完全不需要乘以total_no_of_items;如果你的目标是让vector内部存储10万个PWS元素,这个大小计算和分配逻辑和vector的内部存储没有任何关系。 - 原始内存分配不会初始化非平凡C++对象
std::vector是带有自定义构造函数的非平凡类型,_mm_malloc仅分配原始内存、不会调用vector的构造函数,直接把返回的原始指针当vector对象用会触发未定义行为,大概率导致程序崩溃。 - 设计逻辑冗余
大多数场景下你完全不需要手动分配vector对象的内存,直接声明vector对象即可,动态分配vector本身的场景非常少。
正确实现方式
场景1:不需要动态分配vector,直接创建存储10万PWS元素的vector
#include <vector> struct PWS{ uint64_t key; char* value; uint64_t timestamp; uint64_t txn_id; }; int main() { int total_no_of_items = 100000; // 直接创建vector,提前预留10万元素的空间 std::vector<PWS> pws; pws.reserve(total_no_of_items); // 后续直接push_back/emplace_back填充数据即可 return 0; }
场景2:确实需要动态分配vector对象(极少场景需要)
如果你因为特殊需求必须要堆上分配的vector指针,正确写法如下:
int total_no_of_items = 100000; // 用new分配vector并调用构造函数 std::vector<PWS>* pws = new std::vector<PWS>(); pws->reserve(total_no_of_items); // 使用完后记得手动delete避免内存泄漏 delete pws;
场景3:必须用_mm_malloc分配内存(比如要求特定对齐)
如果你确实需要用_mm_malloc分配原始内存,必须配合定位new手动构造vector:
#include <immintrin.h> #include <vector> int total_no_of_items = 100000; // 分配单个vector对象的内存,大小是sizeof(vector<PWS>)不是指针的大小 std::vector<PWS>* pws = (std::vector<PWS>*)_mm_malloc(sizeof(std::vector<PWS>), alignof(std::vector<PWS>)); // 定位new调用vector的构造函数 new (pws) std::vector<PWS>(); pws->reserve(total_no_of_items); // 使用完后要手动调用析构函数,再释放内存 pws->~vector(); _mm_free(pws);
内容的提问来源于stack exchange,提问作者Adam Barret
相关产品推荐
相关产品推荐

