Re[5]: Крашит в дебрях std при работе с ofstream
От: rg45 СССР  
Дата: 16.12.18 23:53
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Не статических. Я создаю и удаляю объект.... Крч.


S>
S>void somewhere()
S>{
S> for(...)
S> {
S>   Someclass *sc = new Someclass();
S>   ...
S>   delete sc;
S> }
S>}
S>


Упс. А утебя реально new и delete вот так по коду исппользуются, не смар-поинтеры? Так может, ты просто где-нидудь дважды удаляешь какой-то объект?
--
Re[6]: Крашит в дебрях std при работе с ofstream
От: Sheridan Россия  
Дата: 17.12.18 00:00
Оценка: -4 :))) :))) :)
Здравствуйте, rg45, Вы писали:

R>Упс. А утебя реально new и delete вот так по коду исппользуются, не смар-поинтеры? Так может, ты просто где-нидудь дважды удаляешь какой-то объект?

Использование смартпоинтеров считаю признаком плохого тона и отсутствию понимания о времени жизни объектов и проекта вообще. Мол, "мы сами неместные, хрен вас знает что где у всё тут нужно и когда. Поэтому вот есть смартпоинтер, он сам поймет когда удалицца". Но это тема для срача в КСВ, если есть желание — надо дуть туда.
Я же точно знаю время жизни своих объектов.
Дважды — точно нет. Если конечно std::list в remove не вызывает за каким то хреном delete для хранящихся в ём указателей...
Matrix has you...
Re[5]: Крашит в дебрях std при работе с ofstream
От: nekocoder США  
Дата: 17.12.18 03:18
Оценка: +3
Здравствуйте, Sheridan, Вы писали:

S> CLogger &start() { m_mutex.lock(); m_logstream.open(m_filename, std::ofstream::out | std::ofstream::ate | std::ofstream::app); return *this; }

S> void stop() { m_logstream << std::endl; m_logstream.close(); m_mutex.unlock();}

Зачем писать логгер на С++ не зная С++? Возьми готовый, их много.
Re[5]: Крашит в дебрях std при работе с ofstream
От: sgenie  
Дата: 17.12.18 03:44
Оценка:
Здравствуйте, Sheridan, Вы писали:

А где в CSingleTone логгер инициализируется в NULL?


S>
S>class CLogger
S>{
S>public:
S>    CLogger() {m_filename = ".application.log"; start() << "Opening log."; stop();};
S>    ~CLogger(){ start() << "Closing log."; stop(); };

S>    CLogger &start() { m_mutex.lock(); m_logstream.open(m_filename, std::ofstream::out | std::ofstream::ate | std::ofstream::app); return *this; }
S>    void      stop() { m_logstream << std::endl; m_logstream.close(); m_mutex.unlock();}
S>    template <class T> CLogger &operator<<(const T &value) { m_logstream << value; return *this; }
S>private:
S>    std::string   m_filename;
S>    std::ofstream m_logstream;
S>    std::mutex    m_mutex;
S>};

S>class CSingleTone
S>{
S>public:
S>  CLogger *logger() { if(!m_logger) {m_logger = new CLogger(); } return m_logger; };
S>  static CSingleTone *instance();
S>private:
S>  CLogger *m_logger;
S>}

S>Someclass
S>{
S>  Someclass() { CSingleTone::instance()->logger()->start() << "construct"; CSingleTone::instance()->logger()->stop(); }
S>  ~Someclass() { CSingleTone::instance()->logger()->start() << "destruct"; CSingleTone::instance()->logger()->stop(); }
S>}

S>void somewhere()
S>{
S> for(...)
S> {
S>   Someclass *sc = new Someclass();
S>   ...
S>   delete sc;
S> }
S>}
S>
Re[6]: Крашит в дебрях std при работе с ofstream
От: Sheridan Россия  
Дата: 17.12.18 06:55
Оценка:
Здравствуйте, sgenie, Вы писали:

S>А где в CSingleTone логгер инициализируется в NULL?

В двух местах. Второе — лишнее, но макросу пофигу. В nullptr. При создании CSingleTone и при уничтожении.
Matrix has you...
Отредактировано 17.12.2018 7:00 Sheridan . Предыдущая версия .
Re[6]: Крашит в дебрях std при работе с ofstream
От: Sheridan Россия  
Дата: 17.12.18 06:56
Оценка: +2
Здравствуйте, nekocoder, Вы писали:

N>Зачем писать логгер на С++ не зная С++? Возьми готовый, их много.

Может мне и машину продать, раз не таксист?
Matrix has you...
Re[7]: Крашит в дебрях std при работе с ofstream
От: rg45 СССР  
Дата: 17.12.18 08:35
Оценка: +2
Здравствуйте, Sheridan, Вы писали:

S>Использование смартпоинтеров считаю признаком плохого тона и отсутствию понимания о времени жизни объектов и проекта вообще. Мол, "мы сами неместные, хрен вас знает что где у всё тут нужно и когда. Поэтому вот есть смартпоинтер, он сам поймет когда удалицца". Но это тема для срача в КСВ, если есть желание — надо дуть туда.

S>Я же точно знаю время жизни своих объектов.
S>Дважды — точно нет. Если конечно std::list в remove не вызывает за каким то хреном delete для хранящихся в ём указателей...

Ну, это ты зря. Смартпоинтеры и вообще RAII — это не только и не столько контроль времени жизни, это еще и безопасность с точки зрения исключений, и общее качество структуры кода. Этот устав написан кровью:

13. Ensure resources are owned by objects. Use explicit RAII and smart pointers (page# 24, frame# 38).

Кто знает, возможно, сейчас и не пришлось бы искать корни проблемы всем колхозом, следуй ты этим рекоммендациям.
--
Отредактировано 17.12.2018 9:17 rg45 . Предыдущая версия . Еще …
Отредактировано 17.12.2018 9:11 rg45 . Предыдущая версия .
Re[7]: Крашит в дебрях std при работе с ofstream
От: ViTech  
Дата: 17.12.18 09:44
Оценка:
Здравствуйте, Sheridan, Вы писали:

S> Использование смартпоинтеров считаю признаком плохого тона и отсутствию понимания о времени жизни объектов и проекта вообще. Мол, "мы сами неместные, хрен вас знает что где у всё тут нужно и когда. Поэтому вот есть смартпоинтер, он сам поймет когда удалицца". Но это тема для срача в КСВ, если есть желание — надо дуть туда.

S> Я же точно знаю время жизни своих объектов.

Смелое заявление.

S> Проблемы есть, но не в моём коде.


Очень смелое заявление .

S> А где в CSingleTone логгер инициализируется в NULL?

S> В двух местах. Второе — лишнее, но макросу пофигу. В nullptr. При создании CSingleTone и при уничтожении.

Хорошо бы показать код инициализации.
Пока сам не сделаешь...
Re: Крашит в дебрях std при работе с ofstream
От: B0FEE664  
Дата: 17.12.18 09:48
Оценка: 4 (1)
Здравствуйте, Sheridan, Вы писали:

S>Накидайте идей что это может быть? Может уже встречалось такое?...


Судя по описанию, причина падения почти наверняка с порядком создания/разрушения глобальных (включая статик) объектов. Например, если где-то используется std::cout/std::cerr/std::cin, то вполне возможно, что их попытались использовать до создания или после разрушения.
Так же падение возможно, если главный поток (нить) не дожидается завершения других нитей.
И каждый день — без права на ошибку...
Re[5]: Крашит в дебрях std при работе с ofstream
От: B0FEE664  
Дата: 17.12.18 09:59
Оценка: +2
Здравствуйте, Sheridan, Вы писали:

S>
S>class CSingleTone
S>{
S>public:
S>  CLogger *logger() { if(!m_logger) {m_logger = new CLogger(); } return m_logger; };
S>  static CSingleTone *instance();
S>private:
S>  CLogger *m_logger;
S>}
S>


Метод logger() не является потокобезопасным. Если он вызывается из двух и более ниток, то может быть создано два и более объектов типа CLogger.
И каждый день — без права на ошибку...
Re[5]: Крашит в дебрях std при работе с ofstream
От: reversecode google
Дата: 17.12.18 10:02
Оценка: +1
если это точная имплементация
то синглтон не правильный для многопоточной


тогда уж
Logger & instance()
{
static Logger log;
return log
}
Re[2]: Крашит в дебрях std при работе с ofstream
От: Hobbes Россия  
Дата: 17.12.18 10:04
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>попробуй заменить строку m_filename на m_filename.c_str() или на std::string(m_filename)


Чем это может помочь?
Re[3]: Крашит в дебрях std при работе с ofstream
От: kov_serg Россия  
Дата: 17.12.18 10:43
Оценка: +1
Здравствуйте, Hobbes, Вы писали:

_>>попробуй заменить строку m_filename на m_filename.c_str() или на std::string(m_filename)

H>Чем это может помочь?
Это могло сразу падать в случае проблем с this или this->m_filename
Re: Крашит в дебрях std при работе с ofstream
От: kov_serg Россия  
Дата: 17.12.18 10:55
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Полный стек вызовов, крашится в Thread 1:

...
#15 0x000000000049692e in eing::graphic::world::CBlock::~CBlock (this=0x105d070) at ../../../src/graphic/world/cblock.cpp:48
#16 0x0000000000496c89 in eing::graphic::world::CBlock::~CBlock (this=0x105d070) at ../../../src/graphic/world/cblock.cpp:41
...
S>Накидайте идей что это может быть? Может уже встречалось такое?...
А что твориться в файле cblock.cpp в строках 40-50
Re: Крашит в дебрях std при работе с ofstream
От: Teolog  
Дата: 17.12.18 11:43
Оценка: 8 (1)
Предположу по собственным граблям, что проблема не в недрах std, а в коррупте памяти еще до вызова.
Возможные причины: необнуление указателей в членах класса в конструкторе с последующим удалением.
Пронос мимо памяти по индексу в массиве с последующей попыткой удаления объекта
Удаление одного и того же объекта дважды
кривой #pragma pack
ну и попытка конкурентной записи в лог при отсутствии лока на стрим-это харакири

по симптомам лидирует первый вариант, за него работоспособность в отладочном виде и под всякими valgrid'ами, они любят отдавать в new обнуленную память вместо мусора
Отредактировано 17.12.2018 11:51 Teolog . Предыдущая версия .
Re[7]: Крашит в дебрях std при работе с ofstream
От: AleksandrN Россия  
Дата: 17.12.18 11:52
Оценка:
Здравствуйте, Sheridan, Вы писали:

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


S>>А где в CSingleTone логгер инициализируется в NULL?

S>В двух местах. Второе — лишнее, но макросу пофигу. В nullptr. При создании CSingleTone и при уничтожении.

При каких условиях освобождается память под m_logger и является ли освобождение памяти потокобезопасным? Может ли в твоём коде происходить:
1. поток 1 освободил память m_logger
2. поток 2 попытался что-то записать в лог
3. поток 1 обнулил m_logger.

?

В этом случае свалится на шаге 2.
Re: Крашит в дебрях std при работе с ofstream
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 17.12.18 11:55
Оценка: 4 (1)
Здравствуйте, Sheridan, Вы писали:

S>Накидайте идей что это может быть? Может уже встречалось такое?...

Конечно, в 99% проблема коде которая используюет библиотеку. Посмотри внимательно на свой код, выделение/удаление ресурсов и удели внимание многопоточному взаимодействию.
Sic luceat lux!
Re[2]: Крашит в дебрях std при работе с ofstream
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 17.12.18 11:56
Оценка: -1
Здравствуйте, Слава, Вы писали:

С>Теперь тебе понятно, почему люди сделали Java и C#, и стали писать на них?

Только проблемы в джава и C# не были решены, а были перенесены в другую плоскость.
С>PS: переходи на Rust.
А вот тут попытались решить, кстати.
Sic luceat lux!
Re[8]: Крашит в дебрях std при работе с ofstream
От: Sheridan Россия  
Дата: 17.12.18 12:10
Оценка:
Здравствуйте, ViTech, Вы писали:

S>> А где в CSingleTone логгер инициализируется в NULL?

S>> В двух местах. Второе — лишнее, но макросу пофигу. В nullptr. При создании CSingleTone и при уничтожении.

VT>Хорошо бы показать код инициализации.

Ничего там сверхестественного...
class CSingleTone
{
public:
  CLogger *logger() { if(!m_logger) {m_logger = new CLogger(); } return m_logger; };
private:
  CSingleTone() { m_logger = nullptr; }
}


не в этом дело. Логгер успевает дофига отработать перед крешем.
Matrix has you...
Re[8]: Крашит в дебрях std при работе с ofstream
От: Sheridan Россия  
Дата: 17.12.18 12:11
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>При каких условиях освобождается память под m_logger и является ли освобождение памяти потокобезопасным? Может ли в твоём коде происходить:

AN>1. поток 1 освободил память m_logger
AN>2. поток 2 попытался что-то записать в лог
AN>3. поток 1 обнулил m_logger.

Нет. Логгер создаётся при старте приложения и удаляется при выходе. Пока приложение работает — логгер априори жив.
Matrix has you...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.