Re: Инициализация гл. переменных и временные объекты
От: Федько Олег Россия  
Дата: 10.09.03 07:50
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Вот такая значит беда:


КД>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
добавить конструктор, то всё начинает работать правильно .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.