Вызов функции-члена завершается с ошибкой черезshared_ptr внутри лямбда-выражения с нарушением прав доступа, возникающимC++

Программы на 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)
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»