Не печатается из деструктора глобального объекта
От: Amon-RA  
Дата: 28.11.03 13:41
Оценка:
вот код:

   
#include "stdafx.h"
#include <IOSTREAM>

class CCC
{
public:
    CCC();
    ~CCC();
};

CCC::CCC()
{
    std::cout<<"Hello\n";
};

CCC::~CCC()
{
    std::cout<<"O-o-o-op-s-s\n";
};

CCC Glob_VAR;

int main(int argc, char* argv[])
{
    return 0;
}


Печатает только Hello, хотя в деструктор ССС заходит. Почему???
Re: Не печатается из деструктора глобального объекта
От: Lorenzo_LAMAS  
Дата: 28.11.03 13:43
Оценка:
Ну, я бы такое вообще не стал писать. Где гарантия, что cout не будет разрушен раньше твоего глобального объекта?
Of course, the code must be complete enough to compile and link.
Re: Не печатается из деструктора глобального объекта
От: PM  
Дата: 28.11.03 13:44
Оценка:
Здраствуйте, Amon-RA. Вы писали:

AR> вот код:

[]
AR> Печатает только Hello, хотя в деструктор ССС заходит. Почему???
У меня всё печатется. Компиялтор VC 7.1, STLPort 4.6. Может быть std::cout уничтожается раньше твоего глобального объекта?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[2]: Не печатается из деструктора глобального объекта
От: Павел Кузнецов  
Дата: 28.11.03 13:51
Оценка:
Здравствуйте, 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]: Не печатается из деструктора глобального объекта
От: jazzer Россия Skype: enerjazzer
Дата: 28.11.03 13:51
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Ну, я бы такое вообще не стал писать. Где гарантия, что cout не будет разрушен раньше твоего глобального объекта?


гарантия в том, что cout был создан раньше его объекта (хотя бы потому, что он написал "Hello"). Так что он обязан умереть позже.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Не печатается из деструктора глобального объекта
От: Bell Россия  
Дата: 28.11.03 13:52
Оценка:
Здравствуйте, Amon-RA, Вы писали:

Потому что cout видимо уже погиб. А происходит это потому, что порядок инициализации/разрушения глобальных объектов, определенных в разных еденицах трансляции, не определен.
Любите книгу — источник знаний (с) М.Горький
Re: Не печатается из деструктора глобального объекта
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.11.03 13:59
Оценка:
Здравствуйте, Amon-RA, Вы писали:

AR>Печатает только Hello, хотя в деструктор ССС заходит. Почему???


Может cout разрушается раньше чем CCC ?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Не печатается из деструктора глобального объекта
От: Amon-RA  
Дата: 28.11.03 14:04
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, 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]: Не печатается из деструктора глобального объекта
От: achp  
Дата: 28.11.03 14:17
Оценка: +1
Здравствуйте, Bell, Вы писали:

B>Потому что cout видимо уже погиб. А происходит это потому, что порядок инициализации/разрушения глобальных объектов, определенных в разных еденицах трансляции, не определен.


Для cin, cout, clog и cerr это, насколько я помню, не так; есть требование их долгой жизни.

Кроме того, раз конструктор что-то сумел написать в cout, тот был создан раньше, а значит, и умереть долже позже.
Re[4]: Не печатается из деструктора глобального объекта
От: Павел Кузнецов  
Дата: 28.11.03 14:20
Оценка:
Здравствуйте, Amon-RA, Вы писали:

AR> делаю упражнения к Страусу

AR>

AR> не меняя функцию main, выведите на экран
AR> Init
AR> Hello
AR> Destroy

AR> Я вот и придумал такое решение.

Ты придумал каноническое решение.

AR> А есть другое??


Если хочешь еще одно — почитай о функции atexit().
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Не печатается из деструктора глобального объекта
От: Аноним  
Дата: 28.11.03 14:27
Оценка:
atexit

Так ему нельзя менять main
Re[5]: Не печатается из деструктора глобального объекта
От: Amon-RA  
Дата: 28.11.03 14:29
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Ты придумал каноническое решение.


AR>> А есть другое??


ПК>Если хочешь еще одно — почитай о функции atexit().


Я засунул атекзит в деструктор — усе равно не печатает

Удалено избыточное цитирование. -- ПК.
Re[6]: Не печатается из деструктора глобального объекта
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.11.03 14:32
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Так ему нельзя менять main


А он это сделает в конструкторе глобально объекта
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Не печатается из деструктора глобального объекта
От: Аноним  
Дата: 28.11.03 14:33
Оценка:
А вот такого делать не стоит, по-моему.
Re[7]: Не печатается из деструктора глобального объекта
От: Amon-RA  
Дата: 28.11.03 14:34
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Так ему нельзя менять main


A>А он это сделает в конструкторе глобально объекта


Ни в конструкторе ни в деструкторе atexit не печатает

Re[3]: Не печатается из деструктора глобального объекта
От: Анатолий Широков СССР  
Дата: 28.11.03 14:34
Оценка:
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();

public:

init_resource()
{
if( translation_unit_count()++ )
return;
initialize();
}
~init_resource()
{
if( --translation_unit_count() )
return;
destoy();
}
};

namespace {init_resource init_;}; // *

#endif

За счет (*) сторож инициализации попадает в каждую единицу трансляции, причем раньше, чем объявленные там глобальны и статические объекты.
Re[3]: Не печатается из деструктора глобального объекта
От: artelk  
Дата: 28.11.03 14:34
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, 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]: Не печатается из деструктора глобального объекта
От: Amon-RA  
Дата: 28.11.03 14:38
Оценка:
Здравствуйте, artelk, Вы писали:

A> Можно попробовать заменить cout << "..."; на printf("..."); — думаю заработает, т.к. printf — функция, а не объект.


да, принт печатает. Все же странно, что cout глюканулся

Удалено избыточное цитирование. -- ПК.
Re[6]: Не печатается из деструктора глобального объекта
От: Павел Кузнецов  
Дата: 28.11.03 14:48
Оценка: :)
Здравствуйте, Amon-RA, Вы писали:

ПК>> Если хочешь еще одно — почитай о функции atexit().


AR> Я засунул атекзит в деструктор — усе равно не печатает


Я ж предложил почитать о функции atexit, а не засовывать ее в деструктор
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Не печатается из деструктора глобального объекта
От: achp  
Дата: 28.11.03 14:51
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Совершенно верно, здесь как раз нет двух единиц трансляции. О том как инициализировать глобальный объект перед первым его использованием писал Страуструп:


Это уже подробности реализации. Главное, что стандарт такое требование предусматривает.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.