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.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить