Здравствуйте, zou, Вы писали:
zou>Здравствуйте, lnkuser, Вы писали:
L>>Как такое вообще может быть?
zou>Может, gdb ошибочно отображает this=0x0 из-за оптимизированного кода, например? Там чтение NULL в итоге было в этом стеке?
Код не оптимизирован, компилирую так g++ std=c++11 -g -Wall -Wpedantic.
g++ 4.8.2
Там возникали подобные ошибки, в них на одном фрейме this=(корректный адрес), а на последующем уже this=0x0...
Здравствуйте, lnkuser, Вы писали:
L>Тоесть на фрейме 2 все отлично, а на фрейме 1 уже почему то не объекта Call. L>Подозреваю что проблема как-то связана с std::shared_ptr.
L>Как такое вообще может быть?
Я с shared_ptr много не работал, но если объект shared_ptr в фрейме 2 не NULL, это не значит, что сам объект не NULL. Для проверки shared_ptr на NULL есть специальный operator bool. См. http://ru.cppreference.com/w/cpp/memory/shared_ptr
Похоже на непроинициализированный shared_ptr, которому был вызван только конструктор по умолчанию.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Здравствуйте, lpd, Вы писали:
lpd>Здравствуйте, lnkuser, Вы писали:
L>>Тоесть на фрейме 2 все отлично, а на фрейме 1 уже почему то не объекта Call. L>>Подозреваю что проблема как-то связана с std::shared_ptr.
L>>Как такое вообще может быть?
lpd>Я с shared_ptr много не работал, но если объект shared_ptr в фрейме 2 не NULL, это не значит, что сам объект не NULL. Для проверки shared_ptr на NULL есть специальный operator bool. См. http://ru.cppreference.com/w/cpp/memory/shared_ptr lpd>Похоже на непроинициализированный shared_ptr, которому был вызван только конструктор по умолчанию.
перед занесением shared_ptr в массив я его проверяю
$4 = std::shared_ptr (count 1, weak 0) 0xd6337b8
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, lnkuser, Вы писали:
L>>157 std::lock_guard<std::mutex> lck(call_mtx, std::adopt_lock); U>... L>>Как такое вообще может быть?
U>вы уверены, что лок захвачен этим потоком в другом месте? если нет, то захватывайте мьютекс так: U>
Спасибо за ответы, но это тоже не помогает...
Второй поток просто проходит по массиву и проверяет, завершен ли звонок, если да, удаляет элемент (shared_ptr в это случае) из массива.
Пробывал компилировать с clang++, результат такое же...
Здравствуйте, lnkuser, Вы писали:
L>Второй поток просто проходит по массиву и проверяет, завершен ли звонок, если да, удаляет элемент (shared_ptr в это случае) из массива.
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, lnkuser, Вы писали:
L>>Второй поток просто проходит по массиву и проверяет, завершен ли звонок, если да, удаляет элемент (shared_ptr в это случае) из массива.
BFE>Тип calls какой?
Здравствуйте, antropolog, Вы писали:
A>Здравствуйте, lnkuser, Вы писали:
A>а можно всех посмотреть? A>а можно всю ф-цию get_call_by_id увидеть? Непонятно что возвращается если call не найден.
Если такая ошибка возникает только при большом трафике, то выдвину гипотезу, что удаление(или добавление) звонка плохо синхронизировано и портится память.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Здравствуйте, lnkuser, Вы писали:
L>>>Второй поток просто проходит по массиву и проверяет, завершен ли звонок, если да, удаляет элемент (shared_ptr в это случае) из массива. BFE>>Тип calls какой?
L>
L>std::vector<std::shared_ptr<Call>> calls;
L>
Короче. Ставлю диагноз по фотографии. Это не проблемы shared_ptr, это гонки и преждевременная оптимизация.
Мой вам совет: заверните calls в класс, в этом же классе рядом положите защитный мьютекс, сделайте вызовы такие как get_call_by_id(..) методами запирающими этот мьютекс и тогда уж отлаживайте.
Здравствуйте, B0FEE664, Вы писали:
BFE>Мой вам совет: заверните calls в класс, в этом же классе рядом положите защитный мьютекс, сделайте вызовы такие как get_call_by_id(..) методами запирающими этот мьютекс и тогда уж отлаживайте.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, B0FEE664, Вы писали:
BFE>>Мой вам совет: заверните calls в класс, в этом же классе рядом положите защитный мьютекс, сделайте вызовы такие как get_call_by_id(..) методами запирающими этот мьютекс и тогда уж отлаживайте.
EP>Либо взять готовый monitor: EP>
Здравствуйте, Evgeny.Panasyuk, Вы писали:
BFE>>Мой вам совет: заверните calls в класс, в этом же классе рядом положите защитный мьютекс, сделайте вызовы такие как get_call_by_id(..) методами запирающими этот мьютекс и тогда уж отлаживайте.
EP>Либо взять готовый monitor: EP>
Подход интересный (видео посмотрел без звука и не всё), но с monitor я вижу такую проблему: как убедиться, что все операции проводимые с/над calls выполняются исключительно с помощью monitor?