Инициализация гл. переменных и временные объекты
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 09.09.03 14:14
Оценка:
Вот такая значит беда:

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 ставил — не срабатывает.

Вопрос — я могу написать производителю об этой хрене как о баге ?

PS. Буду тестировать службу поддержки зарегистрированных пользователей Borland C++ Builder
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Все гораздо "круче"
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 09.09.03 15:04
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

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

Однозначно

КД>BCB6+SP4

////////////////////////////////////////////////////////////////////////////////
//class TMyVariant

class TMyVariant:public VARIANT
{
 public:
  TMyVariant()
  {
   vt=VT_EMPTY; cout<<"create this=0x"<<hex<<this<<dec<<endl;
  }

  TMyVariant(const TMyVariant& x)
  {
   ::VariantCopy(this,const_cast<TMyVariant*>(&x));
   cout<<"create copy this=0x"<<hex<<this<<dec<<endl;
  }

 ~TMyVariant()
  {
   ::VariantClear(this); cout<<"destroy this=0x"<<hex<<this<<dec<<endl;
  }
};//class TMyVariant

//-----------------------------------------------------------------------
const VARIANT    __c_variant_null_0=TMyVariant();
VARIANT            __variant_null_0=TMyVariant();

//not exists in target code!!!
const TMyVariant  __c_variant_null_1(TMyVariant());

//not exists in target code!!!
TMyVariant          __variant_null_1(TMyVariant());

const TMyVariant  __c_variant_null_2=TMyVariant();
TMyVariant          __variant_null_2=TMyVariant();

//-----------------------------------------------------------------------
int main(int /*argc*/, char* /*argv*/[])
{
 cout<<"vt c_0:"<<__c_variant_null_0.vt<<endl;
 cout<<"vt c_0:"<<__c_variant_null_0.vt<<endl;

 //Compiler ERROR: E2294 Structure required on left side of . or .
 //cout<<"vt c_1:"<<__c_variant_null_1.vt<<endl;

 //Compiler ERROR: E2294 Structure required on left side of . or .
 //cout<<"vt c_1:"<<__c_variant_null_1.vt<<endl;

 cout<<"vt c_2:"<<__c_variant_null_2.vt<<endl;
 cout<<"vt c_2:"<<__c_variant_null_2.vt<<endl;

 cout<<"---- main"<<endl;

 {
  cout<<"lc_0"<<endl;
  const VARIANT    __c_null_0=TMyVariant();
  cout<<"l_0"<<endl;
  VARIANT            __null_0=TMyVariant();

  cout<<"lc_1"<<endl;
  const TMyVariant  __c_null_1(TMyVariant());
  cout<<"l_1"<<endl;
  TMyVariant          __null_1(TMyVariant());

  cout<<"lc_2"<<endl;
  const TMyVariant  __c_null_2=TMyVariant();
  cout<<"lc_2"<<endl;
  TMyVariant          __null_2=TMyVariant();
 }

 cout<<"---- main [exit]"<<endl;

 return 0;
}


На выход идет:
create this=0x4030a4
create this=0x4030b4
create this=0x4030c4
create this=0x4030d4
vt c_0:0
vt c_0:0
vt c_2:0
vt c_2:0
---- main
lc_0
create this=0x12ff5c
l_0
create this=0x12ff4c
lc_1
l_1
lc_2
create this=0x12ff7c
lc_2
create this=0x12ff6c
destroy this=0x12ff6c
destroy this=0x12ff7c
---- main [exit]
destroy this=0x4030d4
destroy this=0x4030c4


Объекты
__c_variant_null_1
__variant_null_1
__c_null_1
__null_1

вообще не создаются. Плюс проблема с не вызовом деструкторов.

Мне уже становится страшно ...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: Все гораздо "круче"
От: Oval  
Дата: 10.09.03 06:23
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>
КД>__c_variant_null_1
КД>__variant_null_1
КД>__c_null_1
КД>__null_1
КД>

КД>вообще не создаются. Плюс проблема с не вызовом деструкторов.
Эти обьекты не создаются потому что не используются. Раз не создаются то и не уничтожаются.
Re[3]: Все гораздо "круче"
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 10.09.03 07:00
Оценка:
Здравствуйте, Oval, Вы писали:

КД>>
КД>>__c_variant_null_1
КД>>__variant_null_1
КД>>__c_null_1
КД>>__null_1
КД>>

КД>>вообще не создаются. Плюс проблема с не вызовом деструкторов.
O>Эти обьекты не создаются потому что не используются. Раз не создаются то и не уничтожаются.

Нет. Ты видел во втором примере такие закоментированные строчки
//Compiler ERROR: E2294 Structure required on left side of . or .
//cout<<"vt c_1:"<<__c_variant_null_1.vt<<endl;


Они потому и закоментированы, потому что компилятор по-любому не создает эти объекты.

Кстати, компилятор не должен устранять не используемые объекты, так как цель этих объектов может быть именно в их создании и разрушении. Примером являются всякие блокировщики доступа к ресурсам.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
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
добавить конструктор, то всё начинает работать правильно .
Re[2]: Все гораздо "круче"
От: Павел Кузнецов  
Дата: 10.09.03 07:57
Оценка: 8 (1)
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>
КД> //not exists in target code!!!
КД> const TMyVariant  __c_variant_null_1(TMyVariant());
КД>


Объявление функции __c_variant_null_1 с результатом const TMyVariant;
аргумент — указатель на функцию без аргументов, возвращающую TMyVariant.

КД>
КД> //not exists in target code!!!
КД> TMyVariant          __variant_null_1(TMyVariant());
КД>


Объявление функции __variant_null_1 с результатом TMyVariant;
аргумент — указатель на функцию без аргументов, возвращающую TMyVariant.

КД>
КД>  //Compiler ERROR: E2294 Structure required on left side of . or .
КД>  //cout<<"vt c_1:"<<__c_variant_null_1.vt<<endl;
КД>


Соответственно: операция . к функциям неприменима.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Инициализация гл. переменных и временные объекты
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 10.09.03 08:34
Оценка:
Здравствуйте, Федько Олег, Вы писали:

ФО>Если же это так сказать просто эксперимент, то действительно в Borland C++ деструктор почему-то

ФО>не вызывается. Такое ощущение, что он принимает чужой конструктор от TMyVariant за конструктор
ФО>от VARIANT, и глазом не моргнув его использует для создания. Что самое интересное, если в VARIANT
ФО>добавить конструктор, то всё начинает работать правильно .

Ага. Это именно эксперимент. Просто одно из чуд Borland-а падало при комипляции реального кода
VARIANT __null_varant=TVariant();//это дикий способ инициализации __null_variant.vt=VT_EMPTY


Переделал на нормальную инициализацию
VARIANT __null_varant={0};


А потом начал мучать под микроскопом и увидел эту охинею с деструкторами.

Правда от "перевозбуждения" лоханулся с объявлениями функций.
Павел —
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.