En c++03
está bastante claro que eliminar un puntero nulo no tiene ningún efecto. De hecho, se afirma explícitamente en §5.3.5/2
que:
En cualquier alternativa, si el valor del operando de eliminar es el puntero nulo, la operación no tiene ningún efecto.
Sin embargo, en el borrador actual de c++0x
esta oración parece faltar. En el resto del borrador, solo pude encontrar oraciones que indiquen lo que sucede si el operando de la expresión de eliminación no es la constante del puntero nulo. ¿La eliminación del puntero nulo todavía está definida en c++0x
, y si es así, dónde?
Notas:
Existe evidencia circunstancial significativa que sugiere que todavía está bien definido.
Primero, están las dos oraciones al §5.3.5/2
afirmar que
En la primera alternativa (eliminar objeto), el valor del operando de eliminar puede ser un valor de puntero nulo, ...
y
En la segunda alternativa (eliminar matriz), el valor del operando de eliminar puede ser un valor de puntero nulo o ...
Estos dicen que se permite que el operando sea nulo, pero por sí mismos no definen realmente qué sucede si lo es.
En segundo lugar, cambiar el significado de delete 0
es un cambio radical importante, y es muy poco probable que el comité de estándares realice este cambio en particular. Además, no se menciona que se trate de un cambio importante en el Anexo de compatibilidad (Anexo C) del c++0x
borrador. Sin embargo, el Anexo C es una sección informativa, por lo que no tiene relación con la interpretación de la norma.
Por otro lado, el hecho de que se requiera eliminar el puntero nulo para que no tenga ningún efecto implica una verificación adicional en tiempo de ejecución. En una gran cantidad de código, el operando nunca puede ser nulo, por lo que esta verificación en tiempo de ejecución está en conflicto con el principio de cero sobrecarga. Tal vez el comité simplemente decidió cambiar el comportamiento para que C ++ estándar esté más en línea con los objetivos de diseño establecidos del lenguaje.
fuente
La nueva redacción no elimina la verificación en tiempo de ejecución de un puntero nulo. Al revés: el borrador del estándar se acerca aún más a decir que una implementación debe realizar una prueba de puntero nulo para ser compatible.
También digno de mención: el antiguo estándar se contradecía al decir (5.3.5 / 2) que "si el valor del operando de eliminar es el puntero nulo, la operación no tiene efecto", pero luego dijo que (5.3.5 / 7) la "expresión-eliminación llamará a una función de desasignación". Llamar a una función es un efecto. Esto es particularmente así porque la función que se llama bien podría ser anulada
operator delete
.La nueva redacción elimina esa contradicción, dejando explícitamente a la implementación si se llama a la función de desasignación en el caso de eliminar un puntero nulo.
fuente