2009-08-11 21 views
5

Mirando un código de ejemplo y encontramos alguna asignación de matriz de tamaño cero. He creado el siguiente fragmento de código para aclarar mi pregunta¿Qué significa/significa la asignación de matriz de tamaño cero?

Este es un código válido:

class T 
{ 
}; 

int main(void) 
{ 
    T * ptr = new T[0]; 

    return 0; 
} 

¿Cuál es su uso? ¿Es ptr válido? ¿Es esta construcción portátil?

Respuesta

8

5.3.4 en el estándar de C++:

6 Cada expresión-constante en un directa-new-declarador puede ser una expresión constante integral (5.19) y evaluar a un valor estrictamente positivo. La expresión en un directa-new-declarador tendrá tipo integral o de enumeración (3.9.1) con un valor no negativo ...

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

Por lo tanto, su código asigna una matriz que se comporta en todos los aspectos como cualquier otra matriz de T (se puede eliminar con delete [], pasar como un parámetro, probablemente otras cosas). Sin embargo, no tiene índices accesibles (es decir, leer o escribir ptr [0] da como resultado un comportamiento indefinido).

En este contexto, la diferencia entre la expresión constante y la expresión no es si la expresión real es constante de tiempo de compilación (obviamente 0), sino si especifica la "última" dimensión de una matriz multidimensional.La sintaxis se define en 5.3.4: 1.

0

Sí, es un comportamiento válido y ptr será válido. La construcción es portátil para todos los compiladores C++ que se adhieren al Estándar C++. Es útil porque le permite escribir código que no requiere que un estudiante especial maneje el caso donde la cantidad de elementos es cero.

Sin embargo, como siempre, lo mejor será utilizar un std :: vector (que también puede ser de tamaño cero) en lugar de una matriz.

2

Está autorizado (5.3.4/6). Su resultado es una matriz vacía, por lo que el valor devuelto es el puntero más allá de la matriz.

0

Una cuestión relacionada es: What should malloc(0) return?

And from some C99 docs, el malloc (0) comportamiento es definido por la implementación: funciones REALLOC

Si el calloc, malloc, y devuelven un puntero nulo o una puntero a un objeto asignado cuando el tamaño solicitado es cero (7.20.3).

Se devuelve un puntero nulo o un puntero único que se puede pasar a free() .

Ver la página de comando man malloc (3C).

Concedido que usted está preguntando sobre C++, pero la información de Malloc es probablemente útil de todos modos.

+1

C++ nuevo está bien definido. – AProgrammer

Cuestiones relacionadas