Здраствуйте, Amon-RA. Вы писали:
AR> вот код:
[] AR> Печатает только Hello, хотя в деструктор ССС заходит. Почему???
У меня всё печатется. Компиялтор VC 7.1, STLPort 4.6. Может быть std::cout уничтожается раньше твоего глобального объекта?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[2]: Не печатается из деструктора глобального объекта
Здравствуйте, Lorenzo_LAMAS, Вы писали:
LL> Ну, я бы такое вообще не стал писать. Где гарантия, что cout не будет разрушен раньше твоего глобального объекта?
27.3/2
The objects are not destroyed during program execution. 265)
265) Constructors and destructors for static objects can access these objects
to read input from stdin or write output to stdout or stderr.
Скорее всего, у Amon-RA старый компилятор (например, VC++6).
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Не печатается из деструктора глобального объекта
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Ну, я бы такое вообще не стал писать. Где гарантия, что cout не будет разрушен раньше твоего глобального объекта?
гарантия в том, что cout был создан раньше его объекта (хотя бы потому, что он написал "Hello"). Так что он обязан умереть позже.
Потому что cout видимо уже погиб. А происходит это потому, что порядок инициализации/разрушения глобальных объектов, определенных в разных еденицах трансляции, не определен.
Любите книгу — источник знаний (с) М.Горький
Re: Не печатается из деструктора глобального объекта
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, Lorenzo_LAMAS, Вы писали:
LL>> Ну, я бы такое вообще не стал писать. Где гарантия, что cout не будет разрушен раньше твоего глобального объекта?
ПК>27.3/2 ПК>
The objects are not destroyed during program execution. 265)
ПК>265) Constructors and destructors for static objects can access these objects
ПК>to read input from stdin or write output to stdout or stderr.
ПК>Скорее всего, у Amon-RA старый компилятор (например, VC++6).
Да, шестерочка. Я это не в реальной проге делаю. Просто делаю упражнения к Страусу. Есть такое
Есть функция
main()
{
std::out<<"Hello"
}
не меняя функцию main, выведите на экран
Init
Hello
Destroy
Я вот и придумал такое решение. А есть другое??
Re[2]: Не печатается из деструктора глобального объекта
Здравствуйте, Bell, Вы писали:
B>Потому что cout видимо уже погиб. А происходит это потому, что порядок инициализации/разрушения глобальных объектов, определенных в разных еденицах трансляции, не определен.
Для cin, cout, clog и cerr это, насколько я помню, не так; есть требование их долгой жизни.
Кроме того, раз конструктор что-то сумел написать в cout, тот был создан раньше, а значит, и умереть долже позже.
Re[4]: Не печатается из деструктора глобального объекта
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Ты придумал каноническое решение.
AR>> А есть другое??
ПК>Если хочешь еще одно — почитай о функции atexit().
Я засунул атекзит в деструктор — усе равно не печатает
Удалено избыточное цитирование. -- ПК.
Re[6]: Не печатается из деструктора глобального объекта
B>>Потому что cout видимо уже погиб. А происходит это потому, что порядок инициализации/разрушения глобальных объектов, определенных в разных еденицах трансляции, не определен.
A>Для cin, cout, clog и cerr это, насколько я помню, не так; есть требование их долгой жизни.
A>Кроме того, раз конструктор что-то сумел написать в cout, тот был создан раньше, а значит, и умереть долже позже.
Совершенно верно, здесь как раз нет двух единиц трансляции. О том как инициализировать глобальный объект перед первым его использованием писал Страуструп:
// resource
#ifndef resource_h
#define resource_h
class resource
{
public:
...
}; // class resource..
// глобальный объект
extern resource global_resource;
// сторож инициализации глобального объекта
class init_resource
{
private:
// счетчик единиц трансляции, в которых требуется глобальный ресурс global_resource
static int& translation_unit_count()
{
static int cnt = 0;
return cnt;
}
// функция инициализции глобального ресурса
static void initialize();
// функция разрушения глобального ресурса
static void destroy();
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, Lorenzo_LAMAS, Вы писали:
LL>> Ну, я бы такое вообще не стал писать. Где гарантия, что cout не будет разрушен раньше твоего глобального объекта?
ПК>27.3/2 ПК>
The objects are not destroyed during program execution. 265)
ПК>265) Constructors and destructors for static objects can access these objects
ПК>to read input from stdin or write output to stdout or stderr.
ПК>Скорее всего, у Amon-RA старый компилятор (например, VC++6).
Конструкторы и деструкторы имеют возможность непосредственно писать в потоки stdin и stdout (через системные вызовы). В классе CCC идет косвенный вывод в stdout через интерфейс std::cout, представляющего из себя обычный объект, не имеющий никаких преимуществ перед другими статическими объектами (вероятно). Если он разрушен раньше Glob_VAR, то вывод не произойдет (в лучшем случае). Можно попробовать заменить
cout << "..."; на printf("..."); — думаю заработает, т.к. printf — функция, а не объект.
Re[4]: Не печатается из деструктора глобального объекта
Здравствуйте, artelk, Вы писали:
A> Можно попробовать заменить cout << "..."; на printf("..."); — думаю заработает, т.к. printf — функция, а не объект.
да, принт печатает. Все же странно, что cout глюканулся
Удалено избыточное цитирование. -- ПК.
Re[6]: Не печатается из деструктора глобального объекта
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Совершенно верно, здесь как раз нет двух единиц трансляции. О том как инициализировать глобальный объект перед первым его использованием писал Страуструп:
Это уже подробности реализации. Главное, что стандарт такое требование предусматривает.