Size: a a a

2021 June 29

 P

 ‌‌Gleb Pilipets... in supapro.cxx
Хм, а я использую вот эту либу для json - https://github.com/nlohmann/json

И вся прога зависает на строке AllocatorTraits::construct(alloc, object.get(), std::forward<Args>(args)...);
Кто-то сталкивался с похожим?

Я нашёл здесь подобный issue 2016 года, но как-то странно...
Я не совсем понимаю причину проблемы
https://github.com/nlohmann/json/issues/231
источник

D

Dmitriy in supapro.cxx
Давай подробности
источник

 P

 ‌‌Gleb Pilipets... in supapro.cxx
Ну просто прога зависает на попытке добавления в JSON объект ключа, значения
источник

 P

 ‌‌Gleb Pilipets... in supapro.cxx
я прошёлся дебагом - вижу, что это случается на этой строчке
источник

 P

 ‌‌Gleb Pilipets... in supapro.cxx
Если детальнее, то есть std::thread, внутри которого запущен run для boost::asio::io_context с work_guard, и вот оттуда после чреды преобразований я делаю emplace в JSON - после этого прога зависает на создании объекта.
источник

K

Kirill in supapro.cxx
Возможно, что в программе UB, и она крашится не там, где это UB происходит
источник

SS

Sergey Sobolev in supapro.cxx
там не может быть проблемы, что работа с объектом происходит не в том же самом треде, в котором он был создан? Понять так сложно, в чем проблема, но такой кейз часто бывает
источник

SS

Sergey Skvortsov in supapro.cxx
Что конкретно происходит в этот момент?
источник

SS

Sergey Skvortsov in supapro.cxx
Программа не может "просто зависнуть", она что-то делает
Ну или остановлена снаружи, но это не твой кейс
источник

SS

Sergey Sobolev in supapro.cxx
имеет смысл под thread санитайзером посмотреть
источник

 P

 ‌‌Gleb Pilipets... in supapro.cxx
я же говорю, что j.emplace(key, ...);

После этого идёт emplace, вот там по цепочке доходит до алокатора и виснет
источник

 P

 ‌‌Gleb Pilipets... in supapro.cxx
ну то есть на следующую строку выполнение не переходит
источник

SS

Sergey Skvortsov in supapro.cxx
Покажи полный стек из дебаггера
источник

SS

Sergey Skvortsov in supapro.cxx
Не до твоего кода, а до самых кишок аллокатора
источник

 P

 ‌‌Gleb Pilipets... in supapro.cxx
Хм, сейчас загуглю, как глянуть стек вызова
источник

SS

Sergey Skvortsov in supapro.cxx
Ну и под санитайзерами запускай, да
источник

АК

Александр Караев... in supapro.cxx
у меня бывало такое зависание из-за повреждения std::map в многопотоке, что приводило к бесконечному циклу где-то внутри реализации
источник

d

d7d1cd in supapro.cxx
Я работаю с АПИ системы. Все АПИ сообщают об ошибке через свой параметр, являющийся указателем на структуру. После вызова АПИ необходимо проверить, не произошла ли ошибка. Если ошибка произошла и определенные поля структуры не равны друг другу, то надо изменить одно из полей и вызвать АПИ снова.

Для решения этой задачи я хочу написать шаблон функции, который будет вызывать АПИ и принимать решение, вызывать ли АПИ второй раз. Но мне не понятно, как внутри такой функции проверить, произошла ли ошибка. Ведь параметры будут передаваться в функцию пачкой. Параметры у всех АПИ разные. Каким по счету будет идти параметр, сигнализирующий об ошибке, зависит от АПИ.

Правильно ли, что здесь решением может быть передача в такую функцию параметра, отвечающего за возврат ошибки, отдельным аргументом? Что-то типа такого:

struct ErrorCode { /* ... */ };

template <typename ApiFoo, typename... ApiArgs>
void CallApi(ErrorCode& ec, ApiFoo apiFoo, ApiArgs... apiArgs) {
 apiFoo(apiArgs...);
 if (!ec.IsError() || ec.Parm1 == ec.Parm2) return;
 ec.Parm1 = ec.Parm2;
 apiFoo(apiArgs...);
}

int main() {
 ErrorCode ec;
 CallApi(ec, SomeApi, 1, &ec, "hello");
}
источник

 P

 ‌‌Gleb Pilipets... in supapro.cxx
ну самое интересное, что если я переключусь на MSVC v142, то всё работает без проблем...

То есть проблема именно если компилить на MSVC v140
Может, где-то не та версия либы буста линкуется?
источник

RN

Random Nickname in supapro.cxx
Привет, подкиньте до чата по Си пожалуйста.
источник