2012-08-13 24 views
5

La relación entre const_multi_array_ref, multi_array_ref y multi_array es como sigue:¿Por qué el destructor de `boost :: multi_array_ref` no es virtual?

  • multi_array_ref se deriva de const_multi_array_ref
  • multi_array se deriva de multi_arry_ref

Sin embargo, los destructores de const_multi_array_ref y multi_array_ref son no virtual. De hecho, no tienen un destructor implementado explícitamente. Solo multi_array tiene uno. ¿Esto implica que no se recomienda el siguiente uso?

multi_array_ref<float, 2> * = new multi_array<float, 2>(extents[3][3]); 

Si es así, ¿por qué?

+0

por favor evite el uso de punteros en boost. boost está diseñado principalmente para utilizar el uso de punteros inteligentes –

Respuesta

2

multi_array las clases de biblioteca no están diseñadas para el polimorfismo dinámico. No tienen funciones virtuales, por lo que no parece razonable hacer que destructor también sea virtual. Es un diseño común similar a STL, multi_array_ref se acaba de utilizar como adaptador de interfaz unificada para casos de posesión y no posesión de datos.

Su muestra de uso es altamente no recomendada - dará lugar a la pérdida de memoria porque multi_array destructor no se ejecutará en la llamada delete.

Pero será seguro acceder a la instancia multi_array a través de una referencia o un puntero al multi_array_ref.

Cuestiones relacionadas