Создание статических обьектов.
От: Bug_z Австрия  
Дата: 12.02.04 11:33
Оценка:
Есть dll, в ней находится класс
class Base
{
   static member1;
};


и есть exe, в нем
class Derive : public Base
{
   static member2;
};


можно ли утверждать, что member1 создастся раньше чем memeber2 ?
Если нет, то как реализовать,чтобы member1 создавался раньше member2.
VS 7.1
Re: Создание статических обьектов.
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.02.04 11:44
Оценка:
Здравствуйте, Bug_z, Вы писали:

B_>Есть dll, в ней находится класс

B_>
B_>class Base
B_>{
B_>   static member1;
B_>};
B_>


B_>и есть exe, в нем

B_>
B_>class Derive : public Base
B_>{
B_>   static member2;
B_>};
B_>


B_>можно ли утверждать, что member1 создастся раньше чем memeber2 ?

B_>Если нет, то как реализовать,чтобы member1 создавался раньше member2.
B_>VS 7.1

Насколько я понимаю, если DLL загружается явно (через LoadLibrary()), то конструктор member2 будет вызван раньше конструктора member1. А если DLL загружается неявно (и не отложенно), то вначале будет вызван конструктор member1.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re: Создание статических обьектов.
От: Кодт Россия  
Дата: 12.02.04 11:45
Оценка:
Здравствуйте, Bug_z, Вы писали:

B_>Есть dll, в ней находится класс

B_>
B_>class Base
B_>{
B_>   static member1;
B_>};
B_>

Не забудь правильно экспортировать класс. Иначе ты получишь два экземпляра переменной Base::member1 — в длл и в экзе.

B_>и есть exe, в нем

B_>
B_>class Derive : public Base
B_>{
B_>   static member2;
B_>};
B_>


B_>можно ли утверждать, что member1 создастся раньше чем memeber2 ?

B_>Если нет, то как реализовать,чтобы member1 создавался раньше member2.

Если member2 как-то использует member1 — то разумеется. Если нет — то и волновать не должно
Перекуём баги на фичи!
Re[2]: Создание статических обьектов.
От: Bug_z Австрия  
Дата: 12.02.04 12:06
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Не забудь правильно экспортировать класс. Иначе ты получишь два экземпляра переменной Base::member1 — в длл и в экзе.


Что значит правильно? dll грузится неявно, без отложеной загрузки.

B_>>можно ли утверждать, что member1 создастся раньше чем memeber2 ?

B_>>Если нет, то как реализовать,чтобы member1 создавался раньше member2.

К>Если member2 как-то использует member1 — то разумеется.


Использует, т.е. в любом случае будет сначала будет member1, потом member2 ?
Re[3]: Создание статических обьектов.
От: Кодт Россия  
Дата: 12.02.04 12:12
Оценка:
Здравствуйте, Bug_z, Вы писали:

B_>Что значит правильно? dll грузится неявно, без отложеной загрузки.


В случае с VC — написать в объявлении класса
class YOUR_DLL_API MyClass { ..... }

где макрос YOUR_DLL_API в зависимости от того, это Your.dll или всё остальное, принимает значения _declspec(dllexport), _declspec(dllimport)

Ну это я говорю так, на всякий случай, — надеюсь что ты в курсе.
Перекуём баги на фичи!
Re: Создание статических обьектов.
От: Bug_z Австрия  
Дата: 12.02.04 12:13
Оценка:
Здравствуйте, Bug_z, Вы писали:

B_>Есть dll, в ней находится класс

B_>
B_>class Base
B_>{
B_>   static member1;
B_>};
B_>


B_>и есть exe, в нем

B_>
B_>class Derive : public Base
B_>{
B_>   static member2;
B_>};
B_>


B_>можно ли утверждать, что member1 создастся раньше чем memeber2 ?

B_>Если нет, то как реализовать,чтобы member1 создавался раньше member2.
B_>VS 7.1

И еще инетересно, вызов деструкторов производится в обратном порядке или сначала особождаются ресурсы dll а потом экзе?
Re[4]: Создание статических обьектов.
От: Bug_z Австрия  
Дата: 12.02.04 12:15
Оценка:
Здравствуйте, Кодт, Вы писали:
К>В случае с VC — написать в объявлении класса
К>
К>class YOUR_DLL_API MyClass { ..... }
К>

К>где макрос YOUR_DLL_API в зависимости от того, это Your.dll или всё остальное, принимает значения _declspec(dllexport), _declspec(dllimport)

К>Ну это я говорю так, на всякий случай, — надеюсь что ты в курсе.


Спасибо, в курсе
Re: Создание статических обьектов.
От: Bug_z Австрия  
Дата: 12.02.04 12:30
Оценка:
Если создание member1, потом member2, то подскажите как обеспечить правилное удаление, сначала member2, потом member1. т.к. member2 использует member1
Re[2]: Создание статических обьектов.
От: vdimas Россия  
Дата: 12.02.04 12:50
Оценка:
Здравствуйте, Bug_z, Вы писали:

B_>И еще инетересно, вызов деструкторов производится в обратном порядке или сначала особождаются ресурсы dll а потом экзе?


если не выгружаешь DLL явно, то сначала освобождаются ресурсы exe, потом dll
Re[2]: Создание статических обьектов.
От: BOPOH_N Россия  
Дата: 12.02.04 13:50
Оценка:
Здравствуйте, Bug_z, Вы писали:

B_>Если создание member1, потом member2, то подскажите как обеспечить правилное удаление, сначала member2, потом member1. т.к. member2 использует member1


Вообще-то если возникает вопрос о порядке создания/удаления статических/глобальных объектов, по-моему следует пересмотреть дизайн и применить паттерн "синглтон", перейдя от статических объектов к статическим указателям.
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re[3]: Создание статических обьектов.
От: Andrew S Россия http://alchemy-lab.com
Дата: 12.02.04 17:23
Оценка: +1
B_>>Если создание member1, потом member2, то подскажите как обеспечить правилное удаление, сначала member2, потом member1. т.к. member2 использует member1

BOP>Вообще-то если возникает вопрос о порядке создания/удаления статических/глобальных объектов, по-моему следует пересмотреть дизайн и применить паттерн "синглтон", перейдя от статических объектов к статическим указателям.


Паттерн синглетон имеет кучу проблем и при линковке в один физический модуль. Сколько возникнет проблем при раскидывании его частей по библиотекам — даже сложно представить.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: Создание статических обьектов.
От: BOPOH_N Россия  
Дата: 12.02.04 17:35
Оценка:
Здравствуйте, Andrew S, Вы писали:

B_>>>Если создание member1, потом member2, то подскажите как обеспечить правилное удаление, сначала member2, потом member1. т.к. member2 использует member1


BOP>>Вообще-то если возникает вопрос о порядке создания/удаления статических/глобальных объектов, по-моему следует пересмотреть дизайн и применить паттерн "синглтон", перейдя от статических объектов к статическим указателям.


AS>Паттерн синглетон имеет кучу проблем и при линковке в один физический модуль. Сколько возникнет проблем при раскидывании его частей по библиотекам — даже сложно представить


Может уточните, какие проблемы вы имеете в виду. На сколько я понимаю у этого паттерна одна проблема — как и когда убить указатель. Если ввести счетчики то все будет ОК...
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re[5]: Создание статических обьектов.
От: Andrew S Россия http://alchemy-lab.com
Дата: 12.02.04 21:26
Оценка:
B_>>>>Если создание member1, потом member2, то подскажите как обеспечить правилное удаление, сначала member2, потом member1. т.к. member2 использует member1

BOP>>>Вообще-то если возникает вопрос о порядке создания/удаления статических/глобальных объектов, по-моему следует пересмотреть дизайн и применить паттерн "синглтон", перейдя от статических объектов к статическим указателям.


AS>>Паттерн синглетон имеет кучу проблем и при линковке в один физический модуль. Сколько возникнет проблем при раскидывании его частей по библиотекам — даже сложно представить


BOP>Может уточните, какие проблемы вы имеете в виду. На сколько я понимаю у этого паттерна одна проблема — как и когда убить указатель. Если ввести счетчики то все будет ОК...


Вообще то стандартым считаемся регистрация функции убийства при помощи _atexit (явно, непосредственным вызовом, или неявно — как это сделано в синглетоне Майерса).
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[6]: Создание статических обьектов.
От: Кодт Россия  
Дата: 13.02.04 14:01
Оценка:
Здравствуйте, Andrew S, Вы писали:

BOP>>Может уточните, какие проблемы вы имеете в виду. На сколько я понимаю у этого паттерна одна проблема — как и когда убить указатель. Если ввести счетчики то все будет ОК...


AS>Вообще то стандартым считаемся регистрация функции убийства при помощи _atexit (явно, непосредственным вызовом, или неявно — как это сделано в синглетоне Майерса).


У этого способа есть недостаток, когда несколько синглетонов (а статические переменные — это синглетоны ) устанавливают ссылки друг на друга не во время инициализации, а во время исполнения. В результате может возникнуть ситуация, когда некто работает с уже разрушенным объектом.

У подсчёта ссылок есть другой недостаток: "круговая порука", в результате которой можно вообще не дойти до разрушения объектов.
Перекуём баги на фичи!
Re[7]: Создание статических обьектов.
От: BOPOH_N Россия  
Дата: 13.02.04 14:15
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Andrew S, Вы писали:


BOP>>>Может уточните, какие проблемы вы имеете в виду. На сколько я понимаю у этого паттерна одна проблема — как и когда убить указатель. Если ввести счетчики то все будет ОК...


AS>>Вообще то стандартым считаемся регистрация функции убийства при помощи _atexit (явно, непосредственным вызовом, или неявно — как это сделано в синглетоне Майерса).


К>У этого способа есть недостаток, когда несколько синглетонов (а статические переменные — это синглетоны ) устанавливают ссылки друг на друга не во время инициализации, а во время исполнения. В результате может возникнуть ситуация, когда некто работает с уже разрушенным объектом.


К>У подсчёта ссылок есть другой недостаток: "круговая порука", в результате которой можно вообще не дойти до разрушения объектов.


В данном случае никакой "круговой поруки" быть не может т.к. мембер базового класса не должен ссылаться на мембер производного
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re[7]: Создание статических обьектов.
От: Andrew S Россия http://alchemy-lab.com
Дата: 13.02.04 14:22
Оценка:
BOP>>>Может уточните, какие проблемы вы имеете в виду. На сколько я понимаю у этого паттерна одна проблема — как и когда убить указатель. Если ввести счетчики то все будет ОК...

AS>>Вообще то стандартым считаемся регистрация функции убийства при помощи _atexit (явно, непосредственным вызовом, или неявно — как это сделано в синглетоне Майерса).


К>У этого способа есть недостаток, когда несколько синглетонов (а статические переменные — это синглетоны ) устанавливают ссылки друг на друга не во время инициализации, а во время исполнения. В результате может возникнуть ситуация, когда некто работает с уже разрушенным объектом.


К>У подсчёта ссылок есть другой недостаток: "круговая порука", в результате которой можно вообще не дойти до разрушения объектов.


Основной недостаток подсчета ссылок — что объект надо явно создавать и убивать. При помощи же списка финализации это делается автоматически.
Вообще, идеальных вещей нет. У каждого паттерна свои недостатки.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[8]: Создание статических обьектов.
От: Кодт Россия  
Дата: 13.02.04 22:50
Оценка:
Здравствуйте, BOPOH_N, Вы писали:

К>>У подсчёта ссылок есть другой недостаток: "круговая порука", в результате которой можно вообще не дойти до разрушения объектов.


BOP>В данном случае никакой "круговой поруки" быть не может т.к. мембер базового класса не должен ссылаться на мембер производного


Кто-то что-то не понял...
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[9]: Создание статических обьектов.
От: BOPOH_N Россия  
Дата: 16.02.04 09:51
Оценка:
Здравствуйте, Кодт, Вы писали:

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


К>>>У подсчёта ссылок есть другой недостаток: "круговая порука", в результате которой можно вообще не дойти до разрушения объектов.


BOP>>В данном случае никакой "круговой поруки" быть не может т.к. мембер базового класса не должен ссылаться на мембер производного


К>Кто-то что-то не понял...


Наверное... Я рассматривал конкретный пример

class Base
{
   static member1;
};
 
class Derive : public Base
{
   static member2;
};


Где, как я себе это вижу, не может быть перекрестных ссылок между member1 и member2...
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.