我正在处理一些使用 ATLCComBSTR
类型的旧代码。我正在更改它,以便它可以使用 ATL 不附带的 Visual C++ Express Edition 进行编译。我只使用了一个非常小的子集CComBSTR
,所以这样做相当简单。
但是,在分配BSTR
内存块时,我需要用 4 字节长度的前缀填充前四个字节。我担心如果我使用new char[size]
表达式为字符串分配内存,由于分配的char
数组没有正确对齐四字节前缀,我会导致对齐错误。
标准中是否有任何内容说明返回值new
具有哪些对齐要求?我在 C++11 中看到的是:
5.3.4/1 [expr.new]
是否支持过度对齐类型由实现定义(3.11)。3.11/6 [basic.align]
完整类型的对齐要求可以使用 alignof 表达式(5.3.6)查询。此外,char、signed char 和 unsigned char 类型应具有最弱的对齐要求。[注意:这使字符类型能够用作对齐内存区域(7.6.2)的基础类型。-结束注释]
我觉得这有点令人困惑——“最弱的对齐要求”对我来说是“对对齐的最严格限制”,但下面的注释似乎表明标准的意思是相反的。
我像这样使用new char[sizeof(uint32_t) + 2*(length + 1)]
缓冲区安全吗?BSTR
编辑:我刚刚意识到,在这种特定情况下BSTR
,无论如何都需要使用 SysAllocString 来分配字符串;new
但我仍然对以这种方式使用是否可以感兴趣。