Использование массива производных объектов в качестве массива базовых объектов при одинаковых размерах (CComVariant / VARIANT) - PullRequest
4 голосов
/ 02 июня 2010

Я использую код, который обрабатывает массив производных объектов как массив базовых объектов.Размер обоих объектов одинаков.Мне интересно:

  • Безопасно ли это на практике, учитывая, что код будет скомпилирован только на компиляторах Microsoft?

Вот мой пример:

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();

1 Ответ

1 голос
/ 02 июня 2010

Да, CComVariant был разработан для прямой замены VARIANT. Он вытекает из структуры варианта и не добавляет ни виртуальных членов, ни полей (и никаких виртуальных деструкторов), чтобы обеспечить одинаковую структуру памяти. Множество маленьких вспомогательных классов, таких как в ATL / MFC, таких как CRect, CPoint и т. Д.

...