4 Stimmen

Verwendung eines Arrays von abgeleiteten Objekten als Array von Basisobjekten, wenn die Größen gleich sind (CComVariant/VARIANT)

Ich verwende Code, der ein Array von abgeleiteten Objekten als ein Array von Basisobjekten behandelt. Die Größe der beiden Objekte ist die gleiche. Ich frage mich:

  • Ist dies in der Praxis sicher, wenn man bedenkt, dass der Code nur auf Microsoft-Compilern kompiliert werden wird?

Hier ist mein Beispiel:

BOOST_STATIC_ASSERT(sizeof(VARIANT)==sizeof(CComVariant));

//auto_array deletes[] the pointer if detach() isn't called at the end of scope
auto_array<CComVariant> buffer(new CComVariant[bufferSize]);

//...Code that sets the value of each element...

//This takes a range specified as two VARIANT* - the AtlFlagTakeOwnership option
//causes delete[] to be called on the array when the object pEnum referes to 
//is released.
pEnum->Init(buffer.ptr,buffer.ptr+bufferSize,0,AtlFlagTakeOwnership);
buffer.detach();

1voto

Hans Passant Punkte 894572

Ja, CComVariant sollte ein direkter Ersatz für VARIANT sein. Es leitet sich von der Variant-Struktur ab und fügt keine virtuellen Mitglieder oder Felder (und keinen virtuellen Destruktor) hinzu, um sicherzustellen, dass das Speicherlayout dasselbe ist. In ATL/MFC gibt es eine Menge solcher Hilfsklassen, wie CRect, CPoint usw.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X