Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Вот такая значит беда:
КД>BCB6+SP4
КД>КД>class TMyVariant:public VARIANT
КД>{
КД> public:
КД> TMyVariant() {vt=VT_EMPTY;}
КД> ~TMyVariant() {::VariantClear(this);} //деструктор не вызывается
КД>};
КД>
const VARIANT __c_variant_null=TMyVariant();
КД>VARIANT __variant_null=TMyVariant();
КД>
int main(
int /*argc*/,
char*
/*argv*/[])
КД> {
return 0;}
КД>
КД>А ведь, по идее — должен ?
КД>Я на всякий случай даже точку прерывания на самой VariantClear ставил — не срабатывает.
Насколько я понимаю, смысл создания TMyVariant в том, чтобы после завершения программы
__variant_null и __с_variant_null самоотчистились, но этого в любом случае не произойдёт

,
т.к. при завершении вызовется ~VARIANT, а не ~TMyVariant. А т.к. у VARIANT деструктора
нет, то ничего и не вызывается.
Поэтому надо писать:
const TMyVariant __c_variant_null=TMyVariant();
TMyVariant __variant_null=TMyVariant();
Хотя может вы, пиша VARIANT __variant_null=TMyVariant();
имели ввиду, что __variant_null иницализируется с помощью временного объекта типа TMyVariant

?
Хотя на мой взгляд это не имеет ни какого смысла, т.к. деструктор TMyVariant вызовется ещё до
начала main().
Если же это так сказать просто эксперимент, то действительно в Borland C++ деструктор почему-то
не вызывается. Такое ощущение, что он принимает чужой конструктор от TMyVariant за конструктор
от VARIANT, и глазом не моргнув его использует для создания. Что самое интересное, если в VARIANT
добавить конструктор, то всё начинает работать правильно

.