静态指针初始化在'之后重置。初始化

时间:2014-11-10 06:42:34

标签: c++ boost static-members

我有两个这样的课程:

class BasicLogger {
//...
}

class Logger {
public:
    static boost::shared_ptr<Logger> log_;
    static BasicLogger &log(const std::string &key){
        if (!log_) {
            log_.reset(new Logger());
        }
        return (*log_)(key);//calls operator()
    }
    virtual BasicLogger & operator()(const std::string &key);
    virtual ~Logger();
};
//definition of static member
boost::shared_ptr<Logger> Logger::log_;

然后在代码的某处,我使用上面的类:

namespace{
    BasicLogger & csv = Logger::log("trip.csv");
}

当我注意到~Logger()从未被调用时,我的问题就开始了,所以我开始调试了。 该控件首先赶到BasicLogger & csv = Logger::log("trip.csv");行,这最终会初始化我的static shared pointer变量Logger::log_

THEN 行boost::shared_ptr<Logger> Logger::log_;已执行,会将log_重置为null! 我希望共享指针Logger::log_在我的应用程序结束时退出acope,并通过调用~Logger()执行一些逻辑,但它永远不会被调用。

我是否遵循错误/不良做法?有什么建议吗?

由于

1 个答案:

答案 0 :(得分:2)

您正在查看Static Initialization Order Fiascohttps://isocpp.org/wiki/faq/ctors上的一些不错信息)

“修复”它最方便的方法是

  • 使用函数local static而不是globals
  • 使用file-locals static(在单个翻译单元内,定义初始化顺序)

所以:

static boost::shared_ptr<Logger>& getLog() { 
    static boost::shared_ptr<Logger> log_;

    if (!log_) {
        log_.reset(new Logger());
    }

    return log_;
};
static BasicLogger &log(const std::string &key){
    return (*getLog())(key);//calls operator()
}

查看 Live On Coliru


那就是说,看起来你真的想在那里保留一个weak_ptr