2012-08-13 6 views
5

Die Beziehung zwischen const_multi_array_ref, multi_array_refmulti_array und ist wie folgt:Warum ist Destruktor von `boost :: multi_array_ref` nicht virtuell?

  • multi_array_ref von const_multi_array_ref
  • multi_array abgeleitet ist jedoch von multi_arry_ref

abgeleitet wird, sind die Destruktoren von const_multi_array_ref und multi_array_ref nicht- virtuell. Tatsächlich haben sie keinen explizit implementierten Destruktor. Nur multi_array hat eine Eins. Bedeutet dies, dass die folgende Verwendung nicht empfohlen wird?

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

Wenn ja, warum?

+0

vermeiden Sie bitte die Verwendung von Zeigern in Boost. Boost wurde hauptsächlich entwickelt, um die Verwendung von Smartpointern zu nutzen –

Antwort

2

multi_array Bibliotheksklassen sind nicht für dynamische Polymorphie ausgelegt. Sie haben keine virtuellen Funktionen, daher erscheint es nicht vernünftig, Destruktoren auch virtuell zu machen. Es ist ein übliches STL-ähnliches Design, multi_array_ref wird nur als vereinheitlichter Schnittstellenadapter für Datenbesitz- und Nichtbesitzfälle verwendet.

Ihre Verwendung Probe wird sehr nicht empfohlen - es führt zu Speicherverlust, weil multi_array Destructor nicht auf delete Aufruf ausgeführt werden.

Aber es wird sicher sein, multi_array Instanz über Referenz oder Zeiger auf multi_array_ref zugreifen.