给大家带来两种不同的单例设计模式植入:
静态类成员
class SingletonCSM;
using SingletonCSMSp = std::shared_ptr < SingletonCSM > ;
class SingletonCSM
{
public:
~SingletonCSM() { spInstance = nullptr; }
static SingletonCSMSp GetInstance()
{
if (!spInstance)
spInstance = std::make_shared<SingletonCSM>();
return spInstance;
}
private:
SingletonCSM() {}
// will be intilized in the cpp: SingletonCSMSp SingletonCSM::spInstance = nullptr;
static SingletonCSMSp spInstance;
};
静态成员变量
class SingletonFSV;
using SingletonFSVSp = std::shared_ptr < SingletonFSV > ;
class SingletonFSV
{
public:
~SingletonFSV() {}
static SingletonFSVSp GetInstance()
{
static SingletonFSVSp spInstance = std::make_shared<SingletonFSV>();
return spInstance;
}
private:
SingletonFSV() {}
};
我总是使用第一个 impl。SingletonCSM
. 在我们的代码中,我遇到了一个 impl。像SingletonFSV
问题
- 我们可以同时考虑这两个 impl。作为一个有效的暗示。的设计模式?
- 两者在功能上是否相同?
动机
背景
类SingletonFSV
是作为 DLL 项目的一部分实现的。这个 DLL 编译在 中VS 2013
,通过 exe 文件加载到内存中并运行。
问题
我已经升级VS
到VS 2015
,编译了 DLL 项目并运行了 exe。突然,它崩溃了。在调试时,我注意到崩溃发生在 DLL 本身中。make_shared
调用withingGetInstance()
返回nullptr
,自然会造成segmentation fault。
解决方案
我已经改变了SingletonFSV
impl。到SingletonCSM
并且坠机停止了。make_shared
返回了一个有效的指针,问题就解决了。
问题
我只是不明白问题是什么,为什么解决了?