LINUX.ORG.RU

История изменений

Исправление pavlick, (текущая версия) :

Т.е. деструктор глобальной переменной(static storage duration) вызовется когда надо.

Процитированное говоришь лишь о том, что деструкторы будут вызваны в обратном порядке относительно завершения конструкторов. А порядок конструкторов гарантируется лишь в рамках одной единицы трансляции, а не между несколькими. Грубо говоря можно наступить в такое:

//1.cc
Dynamicly_initialized_object gv_obj;
//2.cc
extern Dynamicly_initialized_object gv_obj;
struct S {
   S() {gv_obj.fn();}
   ~S() {gv_obj.fn();}
}gv_s;

Если возьмешь за правило писать подобное или создавать какие-нибудь глобальные vector<S>, то есть вероятность вляпаться. И вот ты говоришь: «посмотрите код», а я вижу std::deque<pkt_vec_t> и мне надо напрягаться, смотреть что это за pkt_vec_t, а можно ли его так заюзать, лучше вообще так не делать и вопросов не будет. Аналогично с использованием new (который ты заюзал дважды), надо максимально заменять на make_unique() + unique_ptr. Исходники так проще смотреть грепом - убедился в отсутсвии new, грепнул *_cast, включил воринг Wold-style-cast. А не разбираться там в головоломках и «крутой» архитектуре, конечно, если ты вообще хочешь чтобы кто-то на код смотрел, а не ради пиара всё.

Исходная версия pavlick, :

Т.е. деструктор глобальной переменной(static storage duration) вызовется когда надо.

Процитированное говоришь лишь о том, что деструкторы будут вызваны в обратном порядке относительно завершения конструкторов. А порядок конструкторов гарантируется лишь в рамках одной единицы трансляции, а не между несколькими. Грубо говоря можно наступить в такое:

//1.cc
Dynamicly_initialized_object gv_obj;
//2.cc
extern Dynamicly_initialized_object gv_obj;
struct S {
   S() {gv_obj.fn();}
   ~S() {gv_obj.fn();}
}gv_s;

Если возьмешь за правило писать подобное или создавать какие-нибудь глобальные vector<S>, то есть вероятность вляпаться. И вот ты говоришь: «посмотрите код», а я вижу std::deque<pkt_vec_t> и мне надо напрягаться, смотреть что это за pkt_vec_t, а можно ли его так заюзать, лучше вообще так не делать и вопросов не будет. Аналогично с использованием new (который ты заюзал дважды), надо максимально заменять на make_unique() + unique_ptr. Исходники так проще смотреть грепом - убедился в отсутсвии new, грепнул *_cast, включил воринг Wold-style-cast. А не разбираться там в головоломках и «крутой» архитектуре.