Fix for false-positive memory leak when using leak detection methods (such as CRT dump memory leaks).

Since we cannot rely on static de-initialisation for freeing the registry::s_instance, this is now lazily allocated instead and freed during spdlog::shutdown() function.
In my test case, saves ~15 reported memory leaks.
pull/2929/head
Pantelis Lekakis 2 years ago
parent ddce42155e
commit 0361ecf18c

@ -30,6 +30,9 @@
namespace spdlog {
namespace details {
registry* registry::s_instance = nullptr;
std::mutex registry::s_instanceMutex;
SPDLOG_INLINE registry::registry()
: formatter_(new pattern_formatter()) {
#ifndef SPDLOG_DISABLE_DEFAULT_LOGGER
@ -237,9 +240,19 @@ SPDLOG_INLINE void registry::set_levels(log_levels levels, level::level_enum *gl
}
}
SPDLOG_INLINE registry &registry::instance() {
static registry s_instance;
return s_instance;
SPDLOG_INLINE void registry::free() {
std::lock_guard<std::mutex> lock(s_instanceMutex);
delete s_instance;
s_instance = nullptr;
}
SPDLOG_INLINE registry &registry::instance() {
std::lock_guard<std::mutex> lock(s_instanceMutex);
if (s_instance == nullptr) {
s_instance = new registry();
}
return *s_instance;
}
SPDLOG_INLINE void registry::apply_logger_env_levels(std::shared_ptr<logger> new_logger) {

@ -90,7 +90,10 @@ public:
static registry &instance();
void apply_logger_env_levels(std::shared_ptr<logger> new_logger);
// explicitely free the singleton instance.
static void free();
void apply_logger_env_levels(std::shared_ptr<logger> new_logger);
private:
registry();
@ -112,6 +115,9 @@ private:
std::shared_ptr<logger> default_logger_;
bool automatic_registration_ = true;
size_t backtrace_n_messages_ = 0;
static registry* s_instance;
static std::mutex s_instanceMutex;
};
} // namespace details

@ -67,7 +67,10 @@ SPDLOG_INLINE void drop(const std::string &name) { details::registry::instance()
SPDLOG_INLINE void drop_all() { details::registry::instance().drop_all(); }
SPDLOG_INLINE void shutdown() { details::registry::instance().shutdown(); }
SPDLOG_INLINE void shutdown() {
details::registry::instance().shutdown();
details::registry::free();
}
SPDLOG_INLINE void set_automatic_registration(bool automatic_registration) {
details::registry::instance().set_automatic_registration(automatic_registration);

Loading…
Cancel
Save