Re[8]: BCB 6.0 - глючит даже RAII !
От: srggal Украина  
Дата: 06.05.08 11:52
Оценка:
Здравствуйте, srggal, Вы писали:

S>Можно попробовать упростиь

S>
S>try
А>>    {
S>        Outer outer;
S>        Inner inner(new Inner());
А>>    }
А>>    catch (...)
А>>    {
А>>        cin.get();
А>>    }
S>

S>Что изменится?

В предложение вкралась неточность — исправил на выделенное.
Будет ли BCB разрушать иннер?
Re[9]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 12:22
Оценка:
Здравствуйте, srggal, Вы писали:

S>В предложение вкралась неточность — исправил на выделенное.

S>Будет ли BCB разрушать иннер?

да, старый баг

~Inner
Re[10]: BCB 6.0 - глючит даже RAII !
От: srggal Украина  
Дата: 06.05.08 12:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, srggal, Вы писали:


S>>Будет ли BCB разрушать иннер?


А>да, старый баг


А>
А>~Inner
А>


теперь попробуем понять, что именно он разрушает:
S>>
S>>try
А>>>    {
S>>        Outer outer;
S>>        Inner* pinner = new Inner();
А>>>    }
А>>>    catch (...)
А>>>    {
А>>>        cin.get();
А>>>    }
S>>


Что изменится?
ЗЫ
Может пора уже вам выложить сгенеренный asm?
Re[11]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 13:12
Оценка:
Здравствуйте, srggal, Вы писали:

S>>>
S>>>        Outer outer;
S>>>        Inner* pinner = new Inner();
S>>>

S>Что изменится?
в лучшую сторону т.е. так работает как надо.

S>Может пора уже вам выложить сгенеренный asm?

легко:
Unit1.cpp.34: auto_ptr<Outer> outer(new Outer());
00401181 66C745E01400     mov word ptr [ebp-0x20],0x0014
00401187 6A08             push 0x08
00401189 E85C0F0000       call CC3260.operator new(unsigned int)
0040118E 59               pop ecx
0040118F 50               push eax
00401190 8D55FC           lea edx,[ebp-0x04]
00401193 52               push edx
00401194 E8AF000000       call _STL::auto_ptr<Outer>::auto_ptr<Outer>(Outer *)
00401199 83C408           add esp,0x08
0040119C FF45EC           inc dword ptr [ebp-0x14]
0040119F 66C745E02000     mov word ptr [ebp-0x20],0x0020
Unit1.cpp.35: auto_ptr<Inner> inner(new Inner());
004011A5 66C745E02C00     mov word ptr [ebp-0x20],0x002c
004011AB 6A08             push 0x08
004011AD E8380F0000       call CC3260.operator new(unsigned int)
004011B2 59               pop ecx
004011B3 8945F4           mov [ebp-0x0c],eax
004011B6 85C0             test eax,eax
004011B8 741A             jz +0x1a
004011BA 66C745E03800     mov word ptr [ebp-0x20],0x0038
004011C0 FF75F4           push dword ptr [ebp-0x0c]
004011C3 E800010000       call Inner::Inner()
004011C8 59               pop ecx
004011C9 66C745E02C00     mov word ptr [ebp-0x20],0x002c
004011CF 8B55F4           mov edx,[ebp-0x0c]
004011D2 EB03             jmp +0x03
004011D4 8B55F4           mov edx,[ebp-0x0c]
004011D7 52               push edx
004011D8 8D45F8           lea eax,[ebp-0x08]
004011DB 50               push eax
004011DC E837010000       call _STL::auto_ptr<Inner>::auto_ptr<Inner>(Inner *)
004011E1 83C408           add esp,0x08
004011E4 FF45EC           inc dword ptr [ebp-0x14]
004011E7 66C745E02000     mov word ptr [ebp-0x20],0x0020
Unit1.cpp.36: }
004011ED FF4DEC           dec dword ptr [ebp-0x14]
004011F0 6A02             push 0x02
004011F2 8D4DF8           lea ecx,[ebp-0x08]
004011F5 51               push ecx
004011F6 E855010000       call _STL::auto_ptr<Inner>::~auto_ptr<Inner>()
004011FB 83C408           add esp,0x08
004011FE FF4DEC           dec dword ptr [ebp-0x14]
00401201 6A02             push 0x02
00401203 8D45FC           lea eax,[ebp-0x04]
00401206 50               push eax
00401207 E874000000       call _STL::auto_ptr<Outer>::~auto_ptr<Outer>()
0040120C 83C408           add esp,0x08
0040120F 66C745E00800     mov word ptr [ebp-0x20],0x0008
00401215 66C745E00000     mov word ptr [ebp-0x20],0x0000
0040121B EB17             jmp +0x17
Unit1.cpp.39: cin.get();
...
Re: bcc32 5.5.1 - тоже самое
От: TailWind  
Дата: 06.05.08 14:31
Оценка:
Результат
~Inner


Тоже есть ошибка!!!
Re[2]: bcc32 5.5.1 - тоже самое
От: TailWind  
Дата: 06.05.08 14:33
Оценка:
Я давно заметил, что при некоторых наворотах:
исключения в конструкторе + auto_ptr
появляются неуловимые глюки!

Думал что я неуч...
Re: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 22:27
Оценка:
Небольшая модификация:
#include <stdio.h>
class I
{
public:
virtual ~I()
{
printf("~I: %x\n", this);
}
};

class A : public I
{
public:
 A()
 {
 printf("A: %x\n", this);
 }
virtual ~A()
 {
 printf("~A: %x\n", this);
 }
};

class B : public I
{
public:
 B()
 {
 printf("B: %x\n", this);
 throw 1;
 }
virtual ~B()
 {
 printf("~B: %x\n", this);
 }
};

class C
{
I *i;
public:
C(I *src):i(src)
 {
 }
~C()
 {
 delete i;
 }
};


int main(int argc, char* argv[])
{
 try
 {
 C aa(new A);
 C bb(new B);
 }
 catch(...)
 {
 printf("caught ...\n");
 }
 return 0;
}


Тут вообще жесть полная:

A: 85429c
B: 854440
~I: 854440
~I: 854440
caught ...

Двойной вызов виртуального деструктора базового класса для одного и тогоже экземпляра его наследника.

Если убрать thow — все зашибись

A: 85429c
B: 854440
~B: 854440
~I: 854440
~A: 85429c
~I: 85429c


Если throw поставить внутри try..catch тоже все хорошо:

A: 85429c
B: 854440
~B: 854440
~I: 854440
~A: 85429c
~I: 85429c
caught ...

Re[2]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 23:37
Оценка:
И на закуску из моей коллекции (когдато довелось с BCB работать):
Следующий код:
AnsiString s = "abcdefg";
for(;;)
 {
 AnsiString ss = GetTickCount() ? s + "123": s + "456";
 }

Вызывает бесконечный отжор памяти.
Re[3]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 07.05.08 00:01
Оценка:
Такой вот тоже отжирает:
std::string s = "abcdefg";
for(;;)
 {
 std::string ss = GetTickCount() ? s + std::string("123"): s + std::string("456");
 }


А вот такой работает нормально:
std::string s = "abcdefg";
for(;;)
 {
 std::string ss = GetTickCount() ? s + "123": s + "456";
 }



А если заменить тернарный оператор на аналогичный if .. else ... то все OK во всех случаях
Re[12]: BCB 6.0 - глючит даже RAII !
От: srggal Украина  
Дата: 07.05.08 07:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, srggal, Вы писали:


S>>>>
S>>>>        Outer outer;
S>>>>        Inner* pinner = new Inner();
S>>>>

S>>Что изменится?
А>в лучшую сторону т.е. так работает как надо.

S>>Может пора уже вам выложить сгенеренный asm?

А>легко:
А>
А>...
А>

Если честно, — не осилил, ибо по приведенному отрывку не смог ничего понять, сорри.
Re[4]: BCB 6.0 - глючит даже RAII !
От: s.ts  
Дата: 07.05.08 13:03
Оценка:
еще в догонку
void p1(const WideString& s)
{
  cout << s[1];
}

void p1(WideString& s)
{
  cout << s[1];
}

В 1-м случае индексация от нуля, во втором — от 1.
Дело, помнится, в наличии operator BSTR(), т.е. implicit преобразования к указателю, и не константном operator[], который 1-based.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.