2017-02-21 2 views
0

Есть ли способ принудительно уничтожить синглетный ядро ​​буксировки? Доступ к нему можно получить через:Принудительное буксирование ядра к выходу из строя?

boost::log::core::get(); 

Что возвращает общий указатель на ядро ​​регистрации. Тем не менее, мне нужно отключить/удалить его явно до того, как мое приложение закроет другие ресурсы/отключит dll и т. Д.

Возможно ли это?

ответ

1

Нет, синглтон только уничтожается при завершении заявки. Но в зависимости от того, чего вы пытаетесь достичь, вы можете освободить определенные ресурсы. Например, вызывая remove_all_sinks, вы можете заставить его освободить все приемники, что приведет к их уничтожению, если на них не ссылаются в другом месте.

+0

Спасибо, за звонок в Андрей. Кажется, remove_all_sinks не помогает. Я использую журнал в плагине, и когда мой плагин выгружается, кажется, что dll boost log отрывается, а затем что-то в потоке boost пытается попытаться получить доступ к памяти буфера. Я явно вызываю flush и удаляет все приемники при выгрузке плагинов, но, похоже, это не помогает. Только будильный журнал использует ускоряющий поток lib. – JeffV

+0

1. Boost.Log не поддерживает выгрузку плагинов, поскольку он сохраняет ссылки на различные статические данные и код внутри. Когда библиотека выгружается, эти ссылки становятся свисающими. Обратите внимание, что промывка или удаление раковины не будет полностью устранять это. 2. Boost.Log создает собственные потоки только при использовании асинхронного ведения журнала, и эти потоки объединяются, когда их стоки уничтожаются. Таким образом, потоки Boost.Log не будут активны после возвращения 'remove_all_sinks'. Если они все еще активны, создайте билет с помощью репродукции и обратной линии. –

+0

Спасибо, @ andrey-semashev. Эта информация очень полезна. – JeffV

Смежные вопросы