2010-01-18 11 views
17

¿El estándar ISO C++ exige algún tipo de orden de destrucción de objetos dentro de contenedores STL?Orden de destrucción de elementos de contenedor STL

  • Están std::list/std::vector/std::map elementos destruidos comenzando desde el principio o el final del contenedor?
  • ¿Puedo confiar en std::map almacenando sus elementos en std::pair s internamente por lo que una clave en un par se destruye antes de su valor (o viceversa)?

Respuesta

18
  1. No especificado en la norma.
  2. Sí, pero esto significa que la clave se destruye después de su valor asociado.
+0

+1 ............ :) –

+0

# 2, sí, eso es lo que quise decir, debería haber escrito al revés. ¿Puede indicarme la parte del estándar que especifica el n. ° 2? –

+0

20.2.2/1, y esto se relaciona con mis comentarios sobre la respuesta de Terry. –

4
  1. no especificado
  2. Sí, puede depender de std :: mapa del almacenamiento de elementos es en std :: pares, pero no veo nada que especifica la parte clave de un par std :: siendo destruido antes de una porción de Valor.
+2

La norma obliga a los miembros de datos * first * y * second * y los muestra en ese orden, que, si esa orden es necesaria, también determina el orden de construcción y destrucción. –

+0

No puedo encontrar nada que diga explícitamente que se requiere una orden, pero tampoco nada que diga que se permita que sea diferente. Como son miembros públicos y definitivamente no están marcados como "solo exposición", ninguna de las otras cláusulas que otorgan libertad de acción a la implementación se aplica. Entonces, tendré que caer del lado de que ese es el orden requerido. –

+0

Al mirar el borrador del estándar C++ 0x, parece que ese estándar exige que * primero * se construya antes del * segundo *. Específicamente, 20.3.3.4 'pair(); Efectos: Inicializa sus miembros como si estuvieran implementados: pair(): \t first(), second() {} 'Lo leí para indicar que el orden está definido, pero lo someteré a un abogado de idiomas. –

Cuestiones relacionadas