Вызов функции-члена завершается с ошибкой черезshared_ptr внутри лямбда-выражения с нарушением прав доступа, возникающим ⇐ C++
-
Гость
Вызов функции-члена завершается с ошибкой черезshared_ptr внутри лямбда-выражения с нарушением прав доступа, возникающим
У меня возникла чрезвычайно странная проблема с нарушением прав доступа при вызове функции-члена объектов через общий указатель в std::function лямбда. У меня есть следующий минимальный код, который я мог бы использовать для воспроизведения:
logger = std::make_shared(lstream);//Принимает std::ostream, использует мьютекс для внутренней синхронизации logger->log("Инициализация пульса");//Работает как положено std::function обратный вызов = [logger_local = logger](bool успех) -> bool { //Указатель на регистратор передается как копия //Если мы закомментируем строку ниже, мы получим нарушение прав доступа при попытке вызвать функцию-член std::cout log("Привет от обратного вызова!"); если (успех) { logger_local->log("We got true");//Это происходит сбой из-за нарушения доступа при удалении указанной выше строки. } вернуть истину; }; auto test_thread = std::thread(обратный вызов, правда); У меня нет идей относительно того, что здесь происходит. Все указывает на проблему с обработкой передачи постоянного текста в функцию, но проблема сразу же исчезает, если мы перед входом в блок if/else выполняем какую-либо операцию, включающую общий указатель. Используемые инструменты — Visual Studio 2022, стандарт C++ — C++20.
Ниже также приведен исходный код простого класса регистратора:
экспортировать класс Logger { частный: std::ostream* log_stream = nullptr; std::shared_ptr logging_mutex; публика: Регистратор(std::ostream* out_stream){ logging_mutex = std::make_shared(); log_stream = out_stream; } void log(std::string st){ const std::lock_guard lock(*logging_mutex); (*log_stream)
У меня возникла чрезвычайно странная проблема с нарушением прав доступа при вызове функции-члена объектов через общий указатель в std::function лямбда. У меня есть следующий минимальный код, который я мог бы использовать для воспроизведения:
logger = std::make_shared(lstream);//Принимает std::ostream, использует мьютекс для внутренней синхронизации logger->log("Инициализация пульса");//Работает как положено std::function обратный вызов = [logger_local = logger](bool успех) -> bool { //Указатель на регистратор передается как копия //Если мы закомментируем строку ниже, мы получим нарушение прав доступа при попытке вызвать функцию-член std::cout log("Привет от обратного вызова!"); если (успех) { logger_local->log("We got true");//Это происходит сбой из-за нарушения доступа при удалении указанной выше строки. } вернуть истину; }; auto test_thread = std::thread(обратный вызов, правда); У меня нет идей относительно того, что здесь происходит. Все указывает на проблему с обработкой передачи постоянного текста в функцию, но проблема сразу же исчезает, если мы перед входом в блок if/else выполняем какую-либо операцию, включающую общий указатель. Используемые инструменты — Visual Studio 2022, стандарт C++ — C++20.
Ниже также приведен исходный код простого класса регистратора:
экспортировать класс Logger { частный: std::ostream* log_stream = nullptr; std::shared_ptr logging_mutex; публика: Регистратор(std::ostream* out_stream){ logging_mutex = std::make_shared(); log_stream = out_stream; } void log(std::string st){ const std::lock_guard lock(*logging_mutex); (*log_stream)
Мобильная версия