usar sirve sintaxis que punteros puntero para memoria dev comparar como asignar aritmetica c++ c++11 language-lawyer c++03 delete-operator

c++ - sirve - punteros de char en c



Llamar a eliminar en punteros NULL-C++ 03 vs C++ 11 (2)

En el estándar C ++ 03, veo:

5.3.5 Eliminar

2 Si el operando tiene un tipo de clase, el operando se convierte en un tipo de puntero llamando a la función de conversión mencionada anteriormente, y el operando convertido se usa en lugar del operando original por el resto de esta sección. En cualquiera de las dos alternativas, si el valor del operando de delete es el puntero nulo, la operación no tiene efecto. En la primera alternativa ( eliminar objeto ), el valor del operando de delete será un puntero a un objeto no de matriz o un puntero a un subobjeto (1.8) que representa una clase base de dicho objeto (cláusula 10). Si no, el comportamiento es indefinido. En la segunda alternativa ( eliminar matriz ), el valor del operando de delete será el valor del puntero que resultó de una nueva expresión-matriz anterior.72) Si no, el comportamiento es indefinido.

En el Proyecto de Norma C ++ 11 (N3337), veo:

5.3.5 Eliminar

2 Si el operando tiene un tipo de clase, el operando se convierte en un tipo de puntero llamando a la función de conversión mencionada anteriormente, y el operando convertido se usa en lugar del operando original por el resto de esta sección. En la primera alternativa ( eliminar objeto ), el valor del operando de delete puede ser un valor de puntero nulo, un puntero a un objeto sin matriz creado por una nueva expresión anterior , o un puntero a un sub-objeto (1.8) que representa un clase base de tal objeto (Cláusula 10). Si no, el comportamiento es indefinido. En la segunda alternativa ( eliminar matriz ), el valor del operando de eliminar puede ser un valor de puntero nulo o un valor de puntero que resultó de una nueva expresión de matriz anterior. Si no, el comportamiento es indefinido.

He resaltado las diferencias entre las especificaciones en los dos estándares. Me parece extraño que el estándar de 2003 fuera más enfático en cómo deben tratarse los punteros NULL mientras que el estándar de 2011 no dice nada sobre lo que debe hacer una implementación.

  1. ¿Cambió la verborrea del estándar C ++ 11 entre el borrador del estándar y el estándar actual? ¿Si es así, cómo?

  2. Si la vergüenza del proyecto de norma permanece sin cambios en la norma actual, ¿cuál fue la razón para cambiar una declaración muy fuerte a casi nada entre 2003 y 2011?


El último borrador de C ++ 14 (N3797) tiene una redacción aproximadamente equivalente en esta sección. Pero el comportamiento está igualmente fuertemente especificado, pero no en el mismo párrafo.

Si el valor del operando de la expresión de eliminación no es un valor de puntero nulo, la expresión de eliminación invocará el destructor (si existe) para el objeto o los elementos de la matriz que se eliminará. En el caso de una matriz, los elementos se destruirán en orden de dirección decreciente (es decir, en orden inverso a la finalización de su constructor; ver 12.6.2).

Si el valor del operando de la expresión de eliminación no es un valor de puntero nulo, entonces: - Si la llamada de asignación para la expresión nueva para el objeto a eliminar no se omitió (5.3.4), la expresión de eliminación llamar a una función de desasignación (3.7.4.2). El valor devuelto de la llamada de asignación de la nueva expresión se pasará como el primer argumento a la función de desasignación. - De lo contrario, la expresión de eliminación no llamará a una función de desasignación (3.7.4.2).

Estos párrafos son claramente tan fuertes como C ++ 03. El Comité no podría haber roto el comportamiento de los programas que delete los punteros nulos, ya que están muy extendidos y el costo de los arreglos sería demasiado grande. Hubiera hecho que C ++ 11 no se pudiera implementar.


Parece que podemos encontrar una razón para este cambio en el informe de defectos 348 , que dice:

Específicamente, el estándar dice en 5.3.5 [expr.delete] párrafo 2:

... si el valor del operando de eliminar es el puntero nulo, la operación no tiene efecto.

Estándar no especifica el término "no tiene efecto". No queda claro en este contexto, si se requiere que la función de desasignación llamada no tenga efecto, o la expresión de eliminación no llamará a la función de desasignación.

Además, en el párrafo 4, la norma dice sobre la función de desasignación por defecto:

Si la expresión de eliminación llama a la función de desasignación de implementación (3.7.4.2 [basic.stc.dynamic.deallocation]), si el operando de la expresión de eliminación no es la constante del puntero nulo, ...

¿Por qué es tan específico en la interacción de la función de desasignación predeterminada y delete-expr?

Si "no tiene efecto" es un requisito para la función de desasignación, entonces debe indicarse en 3.7.4.2 [basic.stc.dynamic.deallocation], o en 18.6.1.1 [new.delete.single] y 18.6.1.2 [ new.delete.array], y debe indicarse explícitamente.

parte de la resolución fue el cambio en la redacción que anotó, aunque el lenguaje en torno a esa redacción ha cambiado bastante, pero la lógica de deshacerse del lenguaje aún no tiene efecto , no es un término bien definido y, por lo tanto, debería serlo. Sustituido por lenguaje bien especificado.