BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 05.05.08 14:11
Оценка:
Нашел еще один глюк у BCB6.0 нарушающий основополагающий принцип — RAII:

#include <iostream>
#include <memory>


using namespace std;


class Outer
{
public:
    ~Outer()
    {
        cout << "~Outer" << endl;
    }
};

class Inner
{
public:
    Inner()
    {
        throw 1;
    }
    ~Inner()
    {
        cout << "~Inner" << endl;
    }
};

int main()
{
    try
    {
        auto_ptr<Outer> outer(new Outer());
        auto_ptr<Inner> inner(new Inner());
    }
    catch (...)
    {
        cin.get();
    }
}

ни за что не угадаете, что в результате:
~Inner




з.ы. естественно проверил (copy/paste) в gcc — там усе как нада — ~Outer
з.ы2. как такое вообще возможно?
Re: BCB 6.0 - глючит даже RAII !
От: dotidot Россия  
Дата: 05.05.08 14:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нашел еще один глюк у BCB6.0 нарушающий основополагающий принцип — RAII:


А>int main()

А>{
А> try
А> {
А> auto_ptr<Outer> outer(new Outer());
А> auto_ptr<Inner> inner(new Inner());
А> }
А> catch (...)
А> {
А> cin.get();
А> }
А>}
А>[/ccode]

а это только в main е так выходит? если это скопипастить в f() и f из main вызвать поведение будет тоже?
Re[2]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 05.05.08 14:18
Оценка:
Здравствуйте, dotidot, Вы писали:

D>а это только в main е так выходит? если это скопипастить в f() и f из main вызвать поведение будет тоже?


везде,.. не поверите — в рабочем проекте(!) такое открылось. я не в шоке — я в а%уе.

скажите, как с этим жить?
Re[3]: BCB 6.0 - глючит даже RAII !
От: don ASKet Россия  
Дата: 05.05.08 14:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>скажите, как с этим жить?


нда, дела...

апдейт ставил? помнится еще когда билдер жив был, под него один точно был... что уже правил точно не помню ... попробуй поискать, может где в сети завалялось, а то на борлондовом сайте, вроде как глухо..
или вот еще вариант, откатится к 5-ке если уже так билдер нужен
Меняю два проигрывателя, на один выигрватель! Возможна доплата... ;)
Re[4]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 05.05.08 14:36
Оценка:
Здравствуйте, don ASKet, Вы писали:

DA>нда, дела...


DA>апдейт ставил? помнится еще когда билдер жив был, под него один точно был... что уже правил точно не помню ... попробуй поискать, может где в сети завалялось, а то на борлондовом сайте, вроде как глухо..

DA>или вот еще вариант, откатится к 5-ке если уже так билдер нужен

последний, вроде, апдейт стоит (BCB6_ENT_Update_4.exe).
я, конечно, знаю что дебилдер — гумно, но то, что это даже не объектно-ориентированный язык — для меня открытие
Re: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 05.05.08 14:57
Оценка:
А>з.ы. естественно проверил (copy/paste) в gcc — там усе как нада — ~Outer
А>з.ы2. как такое вообще возможно?
Проверил — таки да. Помнится я за ним еще видел забавные глюки с исполльзованием тернарного оператора и строк в нем. Глюки были в том что память не освобождалась отведенная, тк почемуто не вызывался деструктор временной переменной внутри тернарного оператора. Ща точно не воспоизведу код, тк давно это было...
Re: BCB 6.0 - глючит даже RAII !
От: Mr.Cat  
Дата: 05.05.08 15:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нашел еще один глюк у BCB6.0 нарушающий основополагающий принцип — RAII:

А>ни за что не угадаете, что в результате:
А>
А>~Inner
А>


Возможно, это ошибка в реализации auto_ptr? Пробовали без него?
Re: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 05.05.08 16:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нашел еще один глюк у BCB6.0 нарушающий основополагающий принцип — RAII:


...

А>ни за что не угадаете, что в результате:

А>
А>~Inner
А>


Это наверное типа совместимость с Delphi, там исключение в конструкторе приводит к вызову деструктора.
Правда тогда всё равно непонятно, чего не ~Inner ~Outer а просто ~Inner
Re: BCB 6.0 - глючит даже RAII !
От: Left2 Украина  
Дата: 05.05.08 16:50
Оценка:
А попробуй сделать деструктор Inner виртуальным — думаю, оно вообще должно грохнуться с GPF.
Сдаётся мне что это отрабатывает деструктор auto_ptr<Inner> inner, при чём inner ещё и не инициализирован, так что this в деструкторе Inner вообще состоит из мусора.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re: BCB 6.0 - глючит даже RAII !
От: srggal Украина  
Дата: 05.05.08 20:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А если заменить на:
А>
....
А>int main()
А>{
А>    try
А>    {
        auto_ptr<Outer> outer;
                outer.reset( new Outer );
        auto_ptr<Inner> inner;
                inner.reset(new Inner());
А>    }
А>    catch (...)
А>    {
А>        cin.get();
А>    }
А>}
А>


Что нить изменится?
Re[2]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 06:16
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Возможно, это ошибка в реализации auto_ptr? Пробовали без него?

без него не пробовал, но ошибки в реализации не нашел (STLPort):
explicit auto_ptr(_Tp* __px) { this->__set(__px); }
void  __set(void* __p) { _M_p = __p; }
~auto_ptr() { /* boris : reset(0) might be better */ delete this->get(); }


з.ы. с одним объектом и генерацией исключения в конструкторе все работает как надо.
з.ы2. попробовал, как тут посоветовали использовать не конструктор для инициализации, а reset — все работает как надо.
Re[2]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 06:21
Оценка:
Здравствуйте, srggal, Вы писали:

А>>
S>        auto_ptr<Outer> outer;
S>                outer.reset( new Outer );
S>        auto_ptr<Inner> inner;
S>                inner.reset(new Inner());
А>>

S>Что нить изменится?
в корне . так все работает...
Re[2]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 06:27
Оценка:
Здравствуйте, Left2, Вы писали:

L>А попробуй сделать деструктор Inner виртуальным — думаю, оно вообще должно грохнуться с GPF.

L>Сдаётся мне что это отрабатывает деструктор auto_ptr<Inner> inner, при чём inner ещё и не инициализирован, так что this в деструкторе Inner вообще состоит из мусора.

ну угадали!..
тут все гораздо хуже!
#include <iostream>
#include <memory>

using namespace std;

class Base
{
public:
    virtual ~Base()
    {
        cout << "~Base" << endl;
    }
};

class Outer : public Base
{
public:
    ~Outer()
    {
        cout << "~Outer" << endl;
    }
};

class Inner : public Base
{
public:
    Inner()
    {
        throw 1;
    }
    ~Inner()
    {
        cout << "~Inner" << endl;
    }
};

int main()
{
    try
    {
        auto_ptr<Outer> outer(new Outer());
        auto_ptr<Inner> inner(new Inner());
    }
    catch (...)
    {
        cin.get();
    }
}

что получаем в результате?

~Base
~Base

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

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


А>>>
S>>        auto_ptr<Outer> outer;
S>>                outer.reset( new Outer );
S>>        auto_ptr<Inner> inner;
S>>                inner.reset(new Inner());
А>>>

S>>Что нить изменится?
А>в корне . так все работает...

чтд.
ЗЫ
Лефт2 грил немного о другом, не о

А>
..
А>class Inner : public Base
..
А>


Но, о:

...
А>class Inner
{
...
virtual ~Inner()
...
}
Re[4]: BCB 6.0 - глючит даже RAII !
От: Left2 Украина  
Дата: 06.05.08 07:25
Оценка:
S>чтд.
S>ЗЫ
S>Лефт2 грил немного о другом, не о

S>Но, о:


Вообще-то да.
Но и так сойдёт — у Base деструктор виртуальный, так что если бы в inner был мусор, то оно бы тоже грохнулось и в таком варианте.
Так что идея моя похоже не прокатила Надо бы вывести значения this в деструкторе, да и отладчиком/дизассемблером посмотреть что там этот суперкомпилятор нагенерил. Всё же интересно от чего ему так сносит башню.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[5]: BCB 6.0 - глючит даже RAII !
От: srggal Украина  
Дата: 06.05.08 07:33
Оценка:
Здравствуйте, Left2, Вы писали:

S>>чтд.

S>>ЗЫ
S>>Лефт2 грил немного о другом, не о

S>>Но, о:


L>Вообще-то да.

L>Но и так сойдёт — у Base деструктор виртуальный, так что если бы в inner был мусор, то оно бы тоже грохнулось и в таком варианте.
L>Так что идея моя похоже не прокатила Надо бы вывести значения this в деструкторе, да и отладчиком/дизассемблером посмотреть что там этот суперкомпилятор нагенерил. Всё же интересно от чего ему так сносит башню.

Насколько я понимаю, то, если реализация std::auto_ptr корректна — то

auto_ptr<Inner> inner(new Inner());

Генерится код — который никак не расчитывает на генерацию исключения, скажем, как вариант аналог глюков с оптимизацией у MSVC 6 при недекларированных исключениях (сумбурно, но не вспомнил ключ командной строки).

если в конструкторе Inner декларировать исключение — что нить изменится?

ЗЫ
Сорри, нет ни Билдера ни даже винды под рукой
Re[4]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 07:34
Оценка:
Здравствуйте, srggal, Вы писали:

S>Лефт2 грил немного о другом, не о


А>>
S>..
А>>class Inner : public Base
S>..
А>>


S>Но, о:


S>
S>...
А>>class Inner
S>{
S>...
S>virtual ~Inner()
S>...
S>}
S>


так тоже пробовал но решил усложнить пример после того как небыло GPF
Re[6]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 07:42
Оценка:
Здравствуйте, srggal, Вы писали:

S>Насколько я понимаю, то, если реализация std::auto_ptr корректна — то

корректна, в одном из постов приводил выдержки из нее... — детерминированное удаление хранимого указателя в деструкторе


S>Генерится код — который никак не расчитывает на генерацию исключения, скажем, как вариант аналог глюков с оптимизацией у MSVC 6 при недекларированных исключениях (сумбурно, но не вспомнил ключ командной строки).

тож предпологал — включал фулдебаг и т.п.

S>если в конструкторе Inner декларировать исключение — что нить изменится?

всмысле указать спецификацию исключений ктора?
Inner() throw (int)

поведение не изменилось

S>Сорри, нет ни Билдера ни даже винды под рукой

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

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


S>>если в конструкторе Inner декларировать исключение — что нить изменится?

А>всмысле указать спецификацию исключений ктора?
А>
А>Inner() throw (int)
А>

А>поведение не изменилось

Если сформулировать вкратце — проблема похоже в том, что Inner после генерации исключения трактуется из конструктора как полностью сконструированный.

Можно попробовать упростиь
try
А>    {
        Outer outer( new Outer );
        Inner inner(new Inner());
А>    }
А>    catch (...)
А>    {
А>        cin.get();
А>    }

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

После чего, собственно можно начинать изучать кодогенерацию неработающего примера.
Re[8]: BCB 6.0 - глючит даже RAII !
От: Аноним  
Дата: 06.05.08 08:45
Оценка:
Здравствуйте, srggal, Вы писали:

S>Если сформулировать вкратце — проблема похоже в том, что Inner после генерации исключения трактуется из конструктора как полностью сконструированный.

это пол беды, не удаляется при этом полностью сконструированный объект — outer

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

    try
    {
        Outer outer;
        Inner inner;
    }
    catch (...)
    {
        cin.get();
    }

так работает
~Outer
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.