如何正确使用带std::align_val_t的数组版new/delete?
带std::align_val_t的数组版new/delete正确用法
当你使用带std::align_val_t的数组new分配内存时,必须显式调用匹配的全局operator delete[]重载,不能直接用普通的delete[] p——因为普通delete[]不会传递对齐参数,会导致分配与释放的重载不匹配,触发 sanitizer 报错或编译失败。
正确的分配与释放示例
假设T是目标类型,N是数组大小:
#include <new> // 必须包含该头文件以获取std::align_val_t及对应operator重载 // 分配内存 constexpr auto align = alignof(T); T* p = new(std::align_val_t(align)) T[N]; // 正确释放方式一:仅传递指针与对齐值 operator delete[](p, std::align_val_t(align)); // 正确释放方式二:额外传递数组大小(部分重载支持,可选) // operator delete[](p, N, std::align_val_t(align));
为什么普通delete[]不行?
普通的delete[] p会调用不带对齐参数的operator delete[]重载,而你分配时使用了带std::align_val_t的new,这会导致内存分配器接收到的释放请求缺少关键的对齐信息,进而引发类型不匹配、非法释放等问题——这正是你遇到 sanitizer 报错和 MSVC 编译失败的核心原因。
注意事项
- 该特性要求C++17及以上标准,需确保编译器开启对应版本支持(如GCC/Clang用
-std=c++17,MSVC用/std:c++17)。 - 必须包含
<new>头文件,否则无法访问std::align_val_t和对应的全局operator delete[]重载。 - 如果类型
T自定义了operator new[]/operator delete[],需同时提供带std::align_val_t参数的重载,否则会优先调用自定义版本,可能再次出现不匹配问题。
内容的提问来源于stack exchange,提问作者Oersted
相关产品推荐
相关产品推荐

