【发布时间】:2016-09-21 12:39:51
【问题描述】:
给大家带来两种不同的单例设计模式植入:
静态类成员
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 调用withing GetInstance() 返回nullptr,自然导致分段错误。
解决方案
我已更改 SingletonFSV impl。到SingletonCSM 并且崩溃停止了。 make_shared返回了一个有效的指针,问题就解决了。
问题
我只是不明白问题出在哪里,为什么要解决?
【问题讨论】:
-
你不应该内联
static SingletonFSVSp GetInstance() -
请注意,这些都不是单例。它们都有公共构造函数,这意味着您可以创建任意数量的实例。
-
@DieterLücking 与问题有关还是只是一般性评论? 10 倍。
-
@NathanOliver 正确,我会更新问题
-
@idanshmu ...该内联函数的静态变量(未放入特定的翻译单元)是问题。
标签: c++ dll singleton in-memory make-shared