Здравствуйте, Аноним, Вы писали:
А>скажите, как с этим жить?
нда, дела...
апдейт ставил? помнится еще когда билдер жив был, под него один точно был... что уже правил точно не помню ... попробуй поискать, может где в сети завалялось, а то на борлондовом сайте, вроде как глухо..
или вот еще вариант, откатится к 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. как такое вообще возможно?
Проверил — таки да. Помнится я за ним еще видел забавные глюки с исполльзованием тернарного оператора и строк в нем. Глюки были в том что память не освобождалась отведенная, тк почемуто не вызывался деструктор временной переменной внутри тернарного оператора. Ща точно не воспоизведу код, тк давно это было...
Здравствуйте, Аноним, Вы писали:
А>Нашел еще один глюк у BCB6.0 нарушающий основополагающий принцип — RAII: А>ни за что не угадаете, что в результате: А>
А>~Inner
А>
Возможно, это ошибка в реализации auto_ptr? Пробовали без него?
Re: BCB 6.0 - глючит даже RAII !
От:
Аноним
Дата:
05.05.08 16:15
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Нашел еще один глюк у BCB6.0 нарушающий основополагающий принцип — RAII:
...
А>ни за что не угадаете, что в результате: А>
А>~Inner
А>
Это наверное типа совместимость с Delphi, там исключение в конструкторе приводит к вызову деструктора.
Правда тогда всё равно непонятно, чего не ~Inner ~Outer а просто ~Inner
А попробуй сделать деструктор Inner виртуальным — думаю, оно вообще должно грохнуться с GPF.
Сдаётся мне что это отрабатывает деструктор auto_ptr<Inner> inner, при чём inner ещё и не инициализирован, так что this в деструкторе Inner вообще состоит из мусора.
Здравствуйте, Mr.Cat, Вы писали:
MC>Возможно, это ошибка в реализации auto_ptr? Пробовали без него?
без него не пробовал, но ошибки в реализации не нашел (STLPort):
з.ы. с одним объектом и генерацией исключения в конструкторе все работает как надо.
з.ы2. попробовал, как тут посоветовали использовать не конструктор для инициализации, а reset — все работает как надо.
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();
}
}
S>чтд. S>ЗЫ S>Лефт2 грил немного о другом, не о
S>Но, о:
Вообще-то да.
Но и так сойдёт — у Base деструктор виртуальный, так что если бы в inner был мусор, то оно бы тоже грохнулось и в таком варианте.
Так что идея моя похоже не прокатила Надо бы вывести значения this в деструкторе, да и отладчиком/дизассемблером посмотреть что там этот суперкомпилятор нагенерил. Всё же интересно от чего ему так сносит башню.
Здравствуйте, 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 грил немного о другом, не о
А>>
так тоже пробовал но решил усложнить пример после того как небыло 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[8]: BCB 6.0 - глючит даже RAII !
От:
Аноним
Дата:
06.05.08 08:45
Оценка:
Здравствуйте, srggal, Вы писали:
S>Если сформулировать вкратце — проблема похоже в том, что Inner после генерации исключения трактуется из конструктора как полностью сконструированный.
это пол беды, не удаляется при этом полностью сконструированный объект — outer
S>Можно попробовать упростиь