2012-06-19 11 views
7

En su penetrante trabajo,
Error and Exception Handling,
@Dave Abrahams dice:necesita explicación con respecto destrucción doble de excepción objetos

Haga su clase de excepción inmune a doble destrucción si es posible . Desafortunadamente, varios compiladores populares causan ocasionalmente que los objetos de excepción se destruyan dos veces. Si puede hacer que eso no sea inofensivo (por ejemplo, poniendo a cero los punteros borrados), su código será más robusto.

no soy capaz de entender esta directriz particular, puede alguien:

  1. Sírvanse proporcionar un ejemplo de código de este doble escenario de destrucción &
  2. ¿Cuál es la mejor manera de implementar una clase de excepción personalizada ¿para evitar esto?
+2

Según [este hilo] (http://compgroups.net/comp.lang.c++moderated/exception-objects-to-be-destroyed-twi/104604), es un error en el compilador que causa el doble destrucción. – chrisaycock

+2

@chrisaycock: oh, no hice una búsqueda en google en este antes de publicar, pensé que tal vez mi duda era demasiado específica o trivial que cualquiera tendría la misma duda. Lo cual me trae otra Q ***. ¿Es esta guía todavía? ¿relevante? *** –

Respuesta

5

Como @Tony dijo, esta guía fue pensada como una protección contra los errores del compilador. Esta guía se remonta a 2001 aproximadamente, cuando el soporte de excepciones probablemente todavía era un poco inestable. Desde entonces, creo/espero que la mayoría de los compiladores hayan solucionado este error, por lo que la guía podría no ser muy relevante.

FWIW, esta guía se ha eliminado de the CERT coding practices. En la discusión en esta página, se plantea un punto interesante: la destrucción de un objeto dos veces es UB de todos modos, así que lo que sea que hagas para manejar eso en tus clases nunca hará que tu programa sea completamente predecible.

Sin embargo, si realmente desea que su código sea portable entre los compiladores (incluidas las versiones antiguas), probablemente deba tener en cuenta todos estos pequeños fallos técnicos.Por ejemplo, Boost realiza mucho trabajo para solucionar los errores del compilador; simplemente podrían escribir código estándar y diferir la responsabilidad de las fallas en las implementaciones, pero eso dificultaría la adopción de sus bibliotecas.

Si necesita poner el mismo cuidado al escribir su código depende de sus requisitos, y básicamente se reduce a esta pregunta: ¿está apoyando docenas de compiladores realmente vale la pena la cantidad de trabajo que implica?

3

Para citar el artículo por @chrisaycock:

"¿Por qué destruir el doble"? ¡Debido a errores de compilación, es por eso! Este es un error , los compiladores no deberían hacer esto. Pero lo hacen. Trabajé en un proyecto donde me piquen al usar el compilador Studio8 de Sun. I creó un objeto ostringstream en una cláusula de captura y lo encontró destruido dos veces. Para arreglarlo, lo moví a antes de intentarlo, entonces funcionó . Este tipo de error no ocurre muy a menudo. La mayoría de las veces crear objetos en la cláusula de captura estaba bien, pero es algo de lo que debe estar informado el .

Saludos,

Andrew Marlow

+0

Me plantea una serie de preguntas: *** "¿Sigue siendo relevante esta pauta?" ***, *** "¿El código que escribo también debe tener en cuenta los errores del compilador?" ***. ¿Escribir el código libre de UB adherido estándar es bastante difícil si también me ocupo de todas estas cosas? –

+0

+1 Tony agradece la respuesta, @LucTouraille, muy bien expresada. Si puede combinar ambos comentarios y publicarlos como respuesta, con mucho gusto lo marcaré como respuesta aceptada. El comentario sobre la guía se ha eliminado. de preguntas en específico. –

1

No hay escenario en el estándar, donde un objeto puede ser destruido dos veces. Cualquier instancia en que esto ocurra es un error en nombre del usuario o, cuando el compilador destruye el objeto, como una excepción, el error del compilador. Nunca antes había escuchado sobre este error en ningún compilador importante, y no veo razón para creer que sea problemático para cualquiera que escriba código C++ en general.

+0

De hecho, destruir el mismo objeto dos veces es un Comportamiento Indefinido garantizado y nunca he encontrado un escenario así, de ahí la pregunta. + 1 Gracias por la respuesta. –

Cuestiones relacionadas