Здравствуйте, Erop, Вы писали:
E>>>За одно и из деструкторов его не могут звать, часом?
S>>Нет, первый вызов из main() вообще.
E>А зачем тогда вся химия с синглетонами? Почему не просто статический объект? 
Неважно. По факту есть всего один синглтон, который один раз создаётся, один раз удаляется за время жизни приложения. Неважно как.
E>>>Кстати, а зачем его вообще разрушают?
S>>Его не разрушают, точнее разрушают при дестрое снглтона, который дестроится при выходе из приложения. ))
E>Выход из приложение -- это очень долго. В частности это вызов деструкторов всех статических объектов...
Ы том то и дело что крешится не тогда когда выход из приложения.
S>>Ну, собственно, так сейчас и есть. И до креша логгер успевает много чего понаписать.
E>Так значит крэш таки на этапе деструкторов статических объектов? Или в main()?
Не статических. Я создаю и удаляю объект.... Крч.
class CLogger
{
public:
CLogger() {m_filename = ".application.log"; start() << "Opening log."; stop();};
~CLogger(){ start() << "Closing log."; stop(); };
CLogger &start() { m_mutex.lock(); m_logstream.open(m_filename, std::ofstream::out | std::ofstream::ate | std::ofstream::app); return *this; }
void stop() { m_logstream << std::endl; m_logstream.close(); m_mutex.unlock();}
template <class T> CLogger &operator<<(const T &value) { m_logstream << value; return *this; }
private:
std::string m_filename;
std::ofstream m_logstream;
std::mutex m_mutex;
};
class CSingleTone
{
public:
CLogger *logger() { if(!m_logger) {m_logger = new CLogger(); } return m_logger; };
static CSingleTone *instance();
private:
CLogger *m_logger;
}
Someclass
{
Someclass() { CSingleTone::instance()->logger()->start() << "construct"; CSingleTone::instance()->logger()->stop(); }
~Someclass() { CSingleTone::instance()->logger()->start() << "destruct"; CSingleTone::instance()->logger()->stop(); }
}
void somewhere()
{
for(...)
{
Someclass *sc = new Someclass();
...
delete sc;
}
}