我有两个这样的课程:
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()
执行一些逻辑,但它永远不会被调用。
我是否遵循错误/不良做法?有什么建议吗?
由于
答案 0 :(得分:2)
您正在查看Static Initialization Order Fiasco(https://isocpp.org/wiki/faq/ctors上的一些不错信息)
“修复”它最方便的方法是
所以:
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()
}
那就是说,看起来你真的想在那里保留一个weak_ptr
。