On Mon, Mar 11, 2013 at 4:27 PM, Stefan Strasser
Am 11.03.2013 12:51, schrieb Andrey Semashev:
then it's an implemention detail, I'd suggest making all the functions of logging::core static, or make logging::core a namespace. if you wanna add the feature you've mentioned later on, you could for example ask the user to construct and hold a core::log_during_termination object, which - again as an implementation detail - holds a shared_ptr to the internal core.
This won't work because every static function would have to obtain the pointer to the core which may be invalidated because its global destructor has been invoked already.
I'm not suggesting any changes to the internals, only to the interface. Maybe the following code makes it a little clearer:
class core{ public: static void set_filter(){ get()->set_filter_impl(); }
Like I said, you crash in set_filter()/get() because it accesses a destroyed shared_ptr. Or do you have some non-obvious implementation of get() in mind?
private: static shared_ptr<core> get(); void set_filter_impl(); friend class log_during_termination; };
class log_during_termination{ public: log_during_termination() : hold(core::get()){} private: shared_ptr<core> hold; };
user code: -----------
A(){ public: ~A(){ //logging core is not destructed yet } private: log::log_during_termination logterm; }
static A a;