Re[4]: Крашит в дебрях std при работе с ofstream
От: Sheridan Россия  
Дата: 16.12.18 23:39
Оценка:
Здравствуйте, 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;
 }
}
Matrix has you...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.