¿Cuáles son las limitaciones de alineación del operador predeterminado global estándar nuevo?

Estoy trabajando en un código antiguo que utiliza ATLCComBSTR tipo. Lo estoy cambiando para que se compile utilizando Visual C ++ Express Edition, que no viene con ATL. Usé solo un subconjunto muy pequeño deCComBSTR, por lo que hacer esto es bastante simple.

Sin embargo, al asignar elBSTR bloque de memoria, necesito llenar los primeros cuatro bytes con un prefijo de longitud de 4 bytes. Me preocupa que si uso unnew char[size] expresión para asignar la memoria para la cadena, que causará fallas de alineación debido a la asignaciónchar La matriz no tiene la alineación correcta para el prefijo de cuatro bytes.

¿Hay algo en la norma que indique qué alineación requiere los valores devueltos denew ¿tener? Todo lo que veo en C ++ 11 es:

5.3.4 / 1 [expr.new]
Se define por la implementación si se admiten tipos sobre alineados (3.11).

3.11 / 6 [basic.align]
El requisito de alineación de un tipo completo se puede consultar utilizando una expresión alignof (5.3.6). Además, los tipos char, signed char y unsigned char tendrán el requisito de alineación más débil. [Nota: Esto permite que los tipos de caracteres se usen como el tipo subyacente para un área de memoria alineada (7.6.2) .— nota final]

Me parece un poco confuso - el "requisito de alineación más débil" me dice "la restricción menos estricta en la alineación", pero la nota debajo de esto parece indicar que el estándar significa lo contrario.

Estoy seguro usando unnew char[sizeof(uint32_t) + 2*(length + 1)] amortiguar comoBSTR ¿Me gusta esto?

EDITAR: Me acabo de dar cuenta de que en este caso específico deBSTR, uno necesita usar SysAllocString para poder asignar la cadena de todos modos; pero todavía estoy interesado en si está o no bien usarnew De este modo.

Respuestas a la pregunta(3)

Su respuesta a la pregunta