2011-07-21 6 views
6

20.6.9:C++ asignador predeterminado: ¿qué pasaría si el tamaño no es igual al tamaño pasado a la invocación de allocate?

void deallocate(pointer p, size_type n); 
  • requiere: p será un valor de puntero obtenida de asignar(). n será igual al valor pasado como el primer argumento a la invocación de allocate que devuelve p.
  • Efectos: desasigna el almacenamiento al que hace referencia p.
  • Observaciones: Utiliza :: operator delete (void *) (18.6.1), pero no se especifica cuando se llama a esta función.

lo que debería suceder si n no es igual al valor pasado como el primer agrgument a la invocación de asignar los cuales regresó p? No desasignar? ¿Lanzar std::bad_alloc? ...

EDIT: Lo que en realidad quería decir con "lo que debería ocurrir" era: ¿Estaría bien que tirar o hacer valer en una implementación personalizada?

Respuesta

10

Como es habitual en C++ Standard, cuando no se indica nada explícitamente, la violación de los requisitos conduce a un comportamiento indefinido. Deberá significa en todo momento debe, es un requisito, no una opción en C++ Standard.

Por ejemplo, aquí es lo que MSDN says:

El puntero _Ptr debe haber sido devuelto anteriormente por una llamada a asignar a un objeto asignador que compara igual a * esto, la asignación de un objeto de matriz del mismo tamaño y tipo .

lo que significa que el tamaño debe coincidir con precisión, de lo contrario se encontrará con un comportamiento indefinido.

+2

Btw .: Las implementaciones de Microsoft ignoran el tamaño pasado ... – 0xbadf00d

+1

@FrEEzE - La implementación puede ignorar el parámetro porque sabe lo que ** tiene **. Otras implementaciones podrían usarlo, si no recuerdan el tamaño de la asignación en sí. –

+0

Ignorar el tamaño es uno de los tipos válidos de comportamiento indefinido. –

3

No dice. Lo que significa que sería el desagradable "comportamiento indefinido".

+0

Sí, lo sé. Pero quiero saber si estaría bien lanzar o afirmar (en una implementación personalizada) cuando el tamaño no coincida con el tamaño asignado. – 0xbadf00d

+2

Si no está definido, puede hacer lo que quiera. Los contenedores estándar seguramente pasarán el valor correcto. Para sus propios contenedores ** usted ** puede definir el comportamiento. :-) –

1

Esto está presente en el estándar para permitir asignadores subyacentes que no conocen el tamaño de una asignación desde su puntero.

Por ejemplo, el asignador AmigaOS mantiene una lista de bloques de memoria libres e incluso permite la desasignación parcial (es decir, si asigno 1024 bytes, luego libres 512 bytes en el desplazamiento 256, termino con dos asignaciones de 256 bytes), El asignador espera que pase esta información al separador.

Cuestiones relacionadas