编译器是VS2019最新版。
EnvType是通过模板参数传递进来的类型,
在这个模板类的函数中定义一个静态对象,用于单例。改自leveldb的代码(它的单例实现不是static对象,是placement new,对内存泄漏检查是个干扰,故改之):
https://github.com/google/leveldb/blob/main/util/env_windows.cc
template <typename EnvType>
class SingletonEnv {
public:
SingletonEnv() {
}
~SingletonEnv() = default;
SingletonEnv(const SingletonEnv&) = delete;
SingletonEnv& operator=(const SingletonEnv&) = delete;
Env* env() {
static typename EnvType env_storage_;
return reinterpret_cast<Env*>(&env_storage_);
}
这句:static typename EnvType env_storage_;
发现这个静态对象env_storage_在debug版本中最开始时不对,rebuild后没问题。
在release版本中静态对象的构造被优化掉了,貌似直接返回了env_storage_的固定地址。
上一层的那个静态对象的构造也被优化掉了,如下:
Env* Env::Default() {
static WindowsDefaultEnv env_container;
return env_container.env();
}
Env* Env::Default()在release版的实现就是:
mov rax, XXXX // 返回一个固定地址
ret
这显然不符合预期。
改成 static EnvType env_storage_; 后正常。
--
FROM 222.130.137.*