usar referencia que punteros puntero por paso objetos new memoria lenguaje funcion dinamicos dinamica cuando asignacion c++ memory-management new-operator standards-compliance

c++ - referencia - punteros



C++ new int[0]-¿asignará memoria? (5)

Una aplicación de prueba simple:

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

salidas:

0x876c0b8

Así que parece que funciona. ¿Qué dice la norma sobre esto? ¿Es siempre legal "asignar" un bloque de memoria vacío?


¿Qué dice la norma sobre esto? ¿Es siempre 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 aumentará silenciosamente, si solicita cero bytes).

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


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

Encontré que Effective C ++ Third Edition decía así en el "Elemento 51: cumplir con la convención al escribir nuevos y eliminar".


Desde 5.3.4 / 7

Cuando el valor de la expresión en un nuevo declarador directo es cero, se llama a la función de asignación para asignar una matriz sin elementos.

Desde 3.7.3.1/2

El efecto de anular la referencia de un puntero devuelto como una 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 puede hacerlo, pero no puede legalmente (de una manera bien definida en todas las plataformas) eliminar la referencia a la memoria que obtiene (solo puede pasarla a la eliminación de matriz) y debe eliminarla.

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

[32. La intención es tener el 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 completamente legal asignar un bloque de tamaño 0 con new . Simplemente no puede hacer nada útil con él, ya que no hay datos válidos para su acceso. int[0] = 5; es ilegal.

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

Aún deberá delete [] cualquier puntero que recupere de la asignación también.


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