C ++ new int – ¿asignará memoria?

Una aplicación de prueba simple:

cout << new int[0] << endl; 

productos:

 0x876c0b8 

Entonces parece que funciona ¿Qué dice el estándar sobre esto? ¿Siempre es legal “asignar” un bloque de memoria vacío?

Desde 5.3.4 / 7

Cuando el valor de la expresión en un direct-new-declarator es cero, se llama a la función de asignación para asignar una matriz sin elementos.

De 3.7.3.1/2

El efecto de desreferenciar un puntero devuelto como solicitud de tamaño cero no está definido.

también

Incluso si el tamaño del espacio solicitado [por nuevo] es cero, la solicitud puede fallar.

Eso significa que puedes hacerlo, pero no puedes legalmente (de una manera bien definida en todas las plataformas) eliminar la referencia de la memoria que obtienes, solo puedes pasarla a la eliminación de matriz, y debes eliminarla.

Aquí hay una nota de pie interesante (es decir, no una parte normativa de la norma, pero se incluye con fines expositivos) adjunta a la oración de 3.7.3.1/2

[32. La intención es tener operador new () implementable llamando a malloc () o calloc (), por lo que las reglas son sustancialmente las mismas. C ++ difiere de C en que requiere una solicitud cero para devolver un puntero no nulo.]

Sí, es legal asignar una matriz de tamaño cero como esta. Pero también debes eliminarlo.

¿Qué dice el estándar sobre esto? ¿Siempre es legal “asignar” un bloque de memoria vacío?

Cada objeto tiene una identidad única, es decir, una dirección única, que implica una longitud distinta de cero (la cantidad real de memoria boostá silenciosamente, si solicita cero bytes).

Si asignó más de uno de estos objetos, encontrará que tienen direcciones diferentes.

Sí, es completamente legal asignar un bloque de tamaño 0 con new . Simplemente no puede hacer nada útil ya que no hay datos válidos para que pueda acceder. int[0] = 5; es ilegal.

Sin embargo, creo que el estándar permite que cosas como malloc(0) devuelvan NULL .

También deberá delete [] cualquier puntero que obtenga de la asignación.

Curiosamente, C ++ requiere que el operador nuevo devuelva un puntero legítimo incluso cuando se soliciten cero bytes. (Exigir este comportamiento de sonido extraño simplifica las cosas en otras partes del idioma).

Encontré Effective C ++ Third Edition decía así en “Artículo 51: cumplir convenciones al escribir nuevas y eliminar”.